Haskell で次のようなことを実現する最も慣用的な方法は何ですか。
foldl (+) 0 [1,2,3,4,5]
--> 15
または、Ruby での同等のもの:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
明らかに、Python はreduce
、まさに上記のような fold の実装である関数を提供していますが、私が聞いたところによると、'Python 的な' プログラミング方法は、lambda
項や高階関数を避け、可能な場合はリストの内包表記を優先するということです。したがって、関数ではなく、Python でリストまたはリストのような構造を折りたたむための推奨される方法reduce
、またはreduce
これを実現する慣用的な方法はありますか?
ベストアンサー1
Pythonで配列を合計する方法は、sum
他の目的のために、reduce
(からfunctools
モジュール)とoperator
モジュール、例:
def product(xs):
return reduce(operator.mul, xs, 1)
reduce
Haskell の用語では、 は実際には であることに注意してくださいfoldl
。折り畳みを実行するための特別な構文はなく、組み込みの はなくfoldr
、実際に をreduce
非結合演算子とともに使用することは悪いスタイルと見なされます。
高階関数の使用は、非常に Python 的です。関数やクラスを含むすべてがオブジェクトであるという Python の原則をうまく利用しています。ラムダが一部の Python ユーザーから嫌われているのは事実ですが、それは主に、ラムダが複雑になると読みにくくなる傾向があるためです。