2017-05-08 20 views
0

私はPythonから来ており、私がHaskellを学ぶのはかなり難しいです。例えば、私はリストをマージするこの関数を持っています。最初にリストをマージしてから、マージされたリストの合計を返します。正しい構文はどうですか?このHaskellリスト関数で複数のアクションを実行するには?

merge:: [[a]] -> [a] 
merge xss = foldr (++) [] xss 
      return sum [] 

このコードは、最後の行を削除した場合にのみ機能します。しかし、私はマージされたリストの合計を返したい。

+0

2つの別々の関数から構築することができます。最初のものは実際にマージを行い、もう1つは合計を取ります。しかし、これらを組み合わせること( "合成")は機能的な方法で行うべきです:数学関数として 'f(g(x))'、またはHaskellで 'f g x'です。また、和の型は '[a]'ではなく 'a'であり、' return'はあなたがHaskellで何を意味すると考えるのかを意味しないことに注意してください。 –

+1

また、 'return'はハスケルのものではありません。 – karakfa

+2

['return'](http://stackoverflow.com/questions/15323927/whats-so-special-about-return-keyword)はあなたの考えを意味しません – jkeuhlen

答えて

6

今あなたが得る唯一のことは、あなたのコード内の複数のエラー不満、コンパイル時エラーである - 私は最高のものは、Haskellの構文(例えばhttp://learnyouahaskell.com)について少し読むことであろうと思い

merge :: [[a]] -> [a] 

typeclass制約を追加する必要があるので、リストの要素を追加することができます。今では、あなたの関数は考えられる可能性のあるすべての要素に作用すると言います。

merge:: Num a => [[a]] -> [a] 

"マージ"の後に合計するには、開始したように書きたい場合は中間変数を宣言する必要があります。

merge xss = let tmp = foldr (++) [] xss 
      in sum tmp 

またはあなたがにさらに短い

merge = sum . concat 
+0

3番目のコードの断片では、 in ' – bwroga

+0

thx - それを修正しました! – epsilonhalbe

1

たい場合は、いくつかの引数でfoldrを呼び出し、その後、sumを呼び出したい

merge xs = sum $ concat xs 

またはpointfree少し短いそれを書くことができます結果はfoldrです。

あなたは、書面により、容易にそれを行うことができます:あなたは、複数の「文」を記述する必要はありません

merge xss = sum (foldr (++) [] xss) 

+0

(私は、多くの提案がある既存の回答があることを認識していますが、それらのどれも、質問者が直接書くのをどのように書くのか、 – immibis

関連する問題