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の実装である関数を提供しますが、プログラミングの「pythonic」の方法は、lambda
項と高次関数を避け、可能な場合はリスト内包を優先することだと言われました。したがって、リスト、またはreduce
関数ではないPythonのリストのような構造を折りたたむ好ましい方法はありますか、またはreduce
これを達成する慣用的な方法はありますか?
sum
。いくつかの異なるタイプの例を提供したい場合があります。
sum()
これを使用すると、実際には限られた機能が提供されます。たとえばsum([[a], [b, c, d], [e, f]], [])
戻ります[a, b, c, d, e, f]
。
+
が、リストでは、時間とメモリの両方で線形時間操作が行われ、呼び出し全体が二次式になります。使用list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])
は全体的に線形です-そして、それを一度だけ繰り返す必要がある場合は、呼び出しをドロップしてlist
、メモリの観点からそれを一定にすることができます。
sum
十分ではありませんか?