我是Haskell中的新成員,並且 我不明白它是如何工作的。任何人都可以請解釋給我聽的內部結合的作品在這個例子中如何:Haskell中的內部綁定
f = (\x -> ((\x -> x*x) 3)+x)
當我嘗試f 1
我得到10
我是Haskell中的新成員,並且 我不明白它是如何工作的。任何人都可以請解釋給我聽的內部結合的作品在這個例子中如何:Haskell中的內部綁定
f = (\x -> ((\x -> x*x) 3)+x)
當我嘗試f 1
我得到10
你的代碼是相當混淆的,所以讓我們來清理它。我們先從
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抽象,我們可以將square
和f
定義爲函數。再次,這是等效代碼¹:
square y = y*y
f x = square 3 + x
在這一點上,你可能更有意義的代碼。
¹事實上,編譯器可能會優化兩個當談到內聯,只有當提供的所有清單論據發生,但這超出了這個問題的範圍不同。
您可以安全地刪除外部括號:
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
。