Python 3.6 の組み込み関数からは reduce() が削除されていたので作ってみた。
>>> def reduce(f,x,xs): ... for y in xs: ... x = f(x,y) ... return x ... >>> reduce(lambda x,y: x+y, 0, [1,2,3,4,5]) 15 >>> reduce(lambda x,y: x*y, 1, [1,2,3,4,5]) 120 これは Haskell の foldl に相当する。f(x,y) = x+y, x =0, xs = [1,2,3,4,5] の場合この関数は次のような計算になる。 reduce(f,0,[1,2,3,4,5]) = (((((0+1)+2)+3)+4)+5) つまり、リスト [1,2,3,4,5] の要素を先頭からアキュームレータ x に加算していく。Haskell の場合は変数への再代入ができないので、右項の計算式を展開していってリストの最後まで展開していった時点で式の計算を行っている。Python のような手続き型言語は、変数への再代入が可能なので明示的に x をアキュームレータにしてループを回すことで計算できる。 Haskell のリスト関連の関数で、foldr, foldl は難解なほうだが、手続き型の言語と比較することで、その意味がよくわかる。 reduce と foldl のような等価な動作をする関数を関数型と手続き型とで対比することによって、それぞれのコードの意味がよくわかるのが面白い。
by tnomura9
| 2018-01-06 19:12
| Python
|
Comments(0)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||