2009-08-27 16 views
6

ウィキペディアのページでは、summationについては、ハスケルでの同等の操作は、foldlを使用することです。私の質問です:の代わりにこれを使用する理由がありますか??もうひとつは純粋主義者ですか、それとも本当の違いはありませんか?ハスケルの和表記

答えて

11

foldlは、一般的にはtail-recursiveです。再帰は、関数型プログラミング言語の項目のリストを操作する一般的な考え方であり、しばしばより洗練されたループ反復の代替方法を提供します。 foldのようなreduce関数の場合、末尾再帰実装is very efficient。他の人が説明したように、sumは、foldl (+) 0 lの便利なニーモニックです。

おそらく、ウィキペディアのページでのその使用は、テール再帰による総和の一般的な原則を示すことです。しかし、HaskellのPreludeライブラリにはsumが含まれているので、これは理解しやすいほど短く分かりやすいので、コードでそれを使うべきです。

ハスケルのfoldファンクションのnice discussionファンクションは、読みやすい価値のある簡単な例です。

3

ハスケルについてはどこにも記載されていませんが、foldlはそのウィキペディアのページで表示されますが、sumは、foldlという特殊なケースです。これは、例えば、次のように実装できます。違いはありません

sum = foldl (+) 0 
+0

ああ、今私はそれを参照してください。私は 'foldl'の検索を行っていましたが、Wikipediaのページは 'fold'を使用しています。 –

0

sum l = foldl (+) 0 l 

に低減することができます。そのページは、単にsumfoldlを使用して実装されていると言っています。数字のリストの合計を計算する必要がある場合はいつでもsumを使用してください。

1

他で述べたように、違いはありません。しかし、合計コールはフォールドコールより読みやすく、合計が必要な場合は合計に行く予定です。

2

注意すべきことは、合計があなたが望むよりも怠惰かもしれないことです。foldl 'の使用を検討してください。

0

合計の概念は非数値型に拡張することができます:必要なのは、(+)演算とゼロ値に等しいものです。つまり、monoidが必要です。これはHaskell関数 "mconcat"につながり、これはモノイド型の値のリストの和を返します。もちろん、デフォルトの "mconcat"は、 "mappend"というプラス操作で定義されています。