2017-02-22 6 views
0

私はハスケルで新しく、 このコードの仕組みはわかりません。どのようにこの例では、内部結合作品誰も私にを、それを説明してくださいすることができますハスケルの内側の束

f = (\x -> ((\x -> x*x) 3)+x) 

を私はf 1をしようとするとき、私はあなたが安全に、外側の括弧を削除することができます10

答えて

6

あなたのコードはかなり難読化されていますので、それをきれいにしましょう。私たちは、

f = (\x -> ((\x -> x*x) 3)+x) 

で始まり、両方xと呼ばれる2つの変数があることに注意してください - どのように混乱が!だから、これを書いてみましょう

f = (\x -> ((\y -> y*y) 3)+x) 

次に、この内側のラムダ式があります。代わりに使用して、最終的には

square = \y -> y*y 
f = \x -> square 3 + x 

と:私は、不要な括弧を削除したいと思い、この時点で

square = (\y -> y*y) 
f = (\x -> (square 3)+x) 

:我々はそれに名前を付け、fがバインドされているのと同じレベルでそれをバインドすることができますラムダ抽象化では、squarefを関数として定義できます。繰り返しますが、これは同等のコードです.¹:

square y = y*y 
f x = square 3 + x 

この時点で、おそらくこのコードを理解することができます。

が実際にを¹それがすべてマニフェスト引数が提供されている場合にのみ起こりますが、それはこの質問の範囲を超えてインライン化、となると、コンパイラが異なる2を最適化する可能性があります。

1

を得る:

f = \x -> ((\x -> x*x) 3) + x 

今、\x -> stuff構成は、1つの引数xの無名関数です。非常に内側の関数\x -> x*xは、与えられた任意の数を四角形にします。それは3 * 3 == 9となる(\x -> x*x) 3となります。

外部関数は最初に内部関数を呼び出し、結果にxを追加します。だから、あなたは9 + 1 == 10になる。

私はここでバインディングに特別なことはありません。関数は独立変数で、変数はxです。

関連する問題