総和に関するウィキペディアのページでは、Haskellでの同等の操作はfoldlを使用することであると述べています。私の質問は:合計の代わりにこれを使用するように言われる理由はありますか?片方がもう片方よりも「純粋主義者」ですか、それとも本当の違いはありませんか?
6 に答える
foldl
一般的な末尾再帰型のreduce 関数です。再帰は、関数型プログラミング言語でアイテムのリストを操作することについて考える通常の方法であり、多くの場合、はるかに洗練されたループ反復の代替手段を提供します。のような reduce 関数の場合fold
、末尾再帰の実装は非常に効率的です。他の人が説明したように、sum
は の便利なニーモニックですfoldl (+) 0 l
。
おそらく、ウィキペディアのページでの使用は、末尾再帰による合計の一般原則を説明することです。しかし、Haskell Preludeライブラリには が含まれているsum
ため、これはより短く、理解しやすいため、コードで使用する必要があります。
これは Haskell の関数の簡単な例を使った素晴らしい議論fold
で、読む価値があります。
foldl
Haskellについて、またはそのWikipediaページのどこに何も書かれていないのですがsum
、Haskellではのより具体的なケースですfoldl
。たとえば、次のように実装できます。
sum l = foldl (+) 0 l
これは次のように減らすことができます:
sum = foldl (+) 0
注意すべきことの 1 つは、sum が必要以上に遅延する可能性があることです。そのため、foldl' の使用を検討してください。
他の人が述べているように、違いはありません。ただし、sum-callはfold-callよりも読みやすいので、合計が必要な場合はsumを使用します。
違いはありません。sum
そのページは、それがを使用して実装されていると言っているだけfoldl
です。sum
数値のリストの合計を計算する必要があるときはいつでも使用してください。
合計の概念は、非数値型に拡張できます。必要なのは、(+) 演算とゼロ値に相当するものだけです。つまり、モノイドが必要です。これは、モノイド型の値のリストの合計を返すHaskell関数「mconcat」につながります。もちろん、デフォルトの「mconcat」は、プラス演算である「mappend」に関して定義されています。