2017-02-22 65 views
0

我是Haskell中的新成員,並且 我不明白它是如何工作的。任何人都可以請解釋給我聽的內部結合的作品在這個例子中如何:Haskell中的內部綁定

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

當我嘗試f 1我得到10

回答

6

你的代碼是相當混淆的,所以讓我們來清理它。我們先從

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

,並注意到有兩個變量都叫做x - 如何混亂!所以讓我們把它寫成:

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

接下來,有這個內部lambda表達式。我們可以給它一個名稱,並在同一水平f勢必將其綁定:

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

在這一點上,我想刪除不必要的括號:

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

最後,而不是使用lambda抽象,我們可以將squaref定義爲函數。再次,這是等效代碼¹:

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

在這一點上,你可能更有意義的代碼。

¹事實上,編譯器可能會優化兩個當談到內聯,只有當提供的所有清單論據發生,但這超出了這個問題的範圍不同。

1

您可以安全地刪除外部括號:

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

現在,\x -> stuff構造是一個參數x的匿名函數。非常內在的功能\x -> x*x正方形任何給定的數字。 (\x -> x*x) 3叫它,它給你3 * 3 == 9

外部函數首先調用內部函數,並將x添加到結果中。所以,你得到9 + 1 == 10

我沒有看到任何特別的關於綁定在這裏。這些功能是獨立的,以及變量x