閲覧ありがとうございます。
今回投稿させていただいたのは、ラムダ計算についての理解がなかなかできないためです。
現在、関数型プログラミングを学ぶにあたってコンピュータのパラダイムから理解しようと、関数型プログラミングの第一歩であるラムダ計算に取り組んでいるのですが、早速つまづいてしまっています。
ラムダ計算を解くのにあたって重要な、α-conversion,β-reduction,η-conversionがあるということを学んだのですが(https://wiki.haskell.org/Lambda_calculus)、いくら例題をやってもいまいち使い方がつかめません。
例えば、以下のような問題です。
(λf.λx.f(f x))(λy.y+1)2
これは
β → (λx.(λy.y+1)((λy.y+1) x))) 2
β → (λx.(λy.y+1)(x+1))2
β → (λy.y+1)(2+1)
β → (2+1+1)
となります。これは正しいことはわかるのですが、なぜ、λf.に対して(λy.y+1)2ではなく(λy.y+1)だけをβ-reductionしているのかがわかりません。
そして、もしこの同じ問題をこのように解いたら、(最初に(λy.y+1)2をβ-reductionしたら、)
β → (λf.λx.f(f x))(2+1)
β → (λx.(2+1)((2+1) x))
このように明らかに間違えてしまいます。また、(λf.に対して(λy.y+1)2をβ-redecutionしたら、)
β → (λx.((λy.y+1) 2)(((λy.y+1) 2) x)))
β → (λx.(2+1)((2+1) x))
これも結果としては同じ間違いになっています。
ただ、両方ともどこで間違えているのかが正直全くわかりません。
この単純なところにかなり時間をかけてしまっているので、お手数をおかけしますがぜひよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/08 07:27
2018/03/08 07:45
2018/03/08 07:48
2018/03/08 07:53
2018/03/08 10:06
2018/03/08 10:07