6

総和に関するウィキペディアのページでは、Haskellでの同等の操作はfoldlを使用することであると述べています。私の質問は:合計の代わりにこれを使用するように言われる理由はありますか?片方がもう片方よりも「純粋主義者」ですか、それとも本当の違いはありませんか?

4

6 に答える 6

11

foldl一般的な末尾再帰型のreduce 関数です。再帰は、関数型プログラミング言語でアイテムのリストを操作することについて考える通常の方法であり、多くの場合、はるかに洗練されたループ反復の代替手段を提供します。のような reduce 関数の場合fold、末尾再帰の実装は非常に効率的です。他の人が説明したように、sumは の便利なニーモニックですfoldl (+) 0 l

おそらく、ウィキペディアのページでの使用は、末尾再帰による合計の一般原則を説明することです。しかし、Haskell Preludeライブラリには が含まれているsumため、これはより短く、理解しやすいため、コードで使用する必要があります。

これは Haskell の関数の簡単な例を使った素晴らしい議論foldで、読む価値があります。

于 2009-08-27T06:53:33.207 に答える
3

foldlHaskellについて、またはそのWikipediaページのどこに何も書かれていないのですがsum、Haskellではのより具体的なケースですfoldl。たとえば、次のように実装できます。

sum l = foldl (+) 0 l

これは次のように減らすことができます:

sum = foldl (+) 0
于 2009-08-27T06:26:22.277 に答える
2

注意すべきことの 1 つは、sum が必要以上に遅延する可能性があることです。そのため、foldl' の使用を検討してください。

于 2009-08-27T11:05:33.540 に答える
1

他の人が述べているように、違いはありません。ただし、sum-callはfold-callよりも読みやすいので、合計が必要な場合はsumを使用します。

于 2009-08-27T06:44:04.160 に答える
0

違いはありません。sumそのページは、それがを使用して実装されていると言っているだけfoldlです。sum数値のリストの合計を計算する必要があるときはいつでも使用してください。

于 2009-08-27T06:38:53.187 に答える
0

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

于 2009-08-30T15:54:06.757 に答える