2012-06-20 35 views
2

在研究了函數式編程考試,我碰到以下問題來自於以前的測試:哈斯克爾:匿名/λ功能函數組合

t1 = (reverse . take 2 . words . \ _ -> name)"!" 

的任務是寫語句的輸出。變量名稱是以「Smith,John」的形式編寫的學生姓名。如果我輸入語句轉換成WinHugs,我得到下面的輸出:

["John","Smith,"] 

我明白了什麼功能逆轉,以和文字都在做,我知道怎麼了。運營商連接它們。我不明白的是這裏發生了什麼:

\ _ -> name 

什麼是斜槓,下劃線和「箭頭」?另外,引號中的驚歎號是做什麼的? (什麼都沒有?)

回答

6

這是一個放棄其(僅)參數(即「!」)併產生name的lambda函數。

作爲另一拉姆達例如,下面將是一個lambda函數,平方它的參數:

\x -> x * x 

\是用於引入lambda函數的符號。

_表示「關於我們不關心誰的名字的變量」。

->將lambda函數的參數與用於指定其結果的表達式分開。

+0

很好的解釋。儘管如此,我仍然對感嘆號感到困惑。你是否想說在這種情況下,感嘆號僅用於混淆? –

+0

'「!」'是被忽略的值。感嘆號只是被忽略的字符串中的一個字符:忽略它。 – dave4420

+0

謝謝,我想我現在明白了。 –

3

一個常量匿名函數:哪個參數,返回name

Haskell的lambda表達式(即匿名函數)來在這種形式:在使用本參數

\x -> f x 

其中x一種說法,和f x的表達式。特殊變量_匹配任何東西並將其視爲不重要。

5

你所看到的有一個匿名函數或lambda函數(該名稱來自lambda微積分)。反斜槓告訴你,你正在啓動該功能。下劃線表示該函數採用一個參數並忽略它。箭頭從參數列表指向結果 - 在這種情況下,它最終會忽略它的參數並返回名稱。實質上,\_ -> nameconst name相同。

+0

「const name」爲+1。 – leftaroundabout

2

「斜槓」是lambda function的一部分,下劃線是模式中使用的「通配符」(它被丟棄)。箭頭是lambda函數的另一部分。無論輸入如何,函數\ _ -> name都會返回名稱,所以「!」除了提供(未使用的)輸入功能外,什麼都不做。