2013-01-13 40 views
1

這塊的Haskell代碼:哈斯克爾,輸入參數,返回類型

isIn :: (Eq a) => [a] -> [a] -> Bool 
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack) 

這是一個函數的定義,我相信。我如何理解輸入參數是什麼以及返回類型是什麼?

例如:什麼是(Eq a)

回答

3

Eq就是所謂的typeclass。它聲明瞭一些函數,在這種情況下==和朋友,我們可以爲那些爲==和其他提供定義的類型類實例。

這意味着當我們有類似於Eq typeclass的實例時,我們知道我們可以在其上使用==

這裏的訣竅是,在我們的函數中,我們需要有可以檢查它們是否相等的類型。如果我們只有[a] -> [a] -> Bool那麼我們會遇到麻煩,因爲我們只是承諾我們的實現在沒有==運算符的情況下運行,而不運行它。

因此,我們使用=>這增加了我們的函數定義的上下文。它說類似「這將適用於任何a只要aEq類型類別的一個實例」。這樣,我們可以安全地使用==,並且知道我們所有的參數類型都會適當地執行它。

快速插圖

這是一個錯誤:

doIfEqual :: a -> a -> (a -> a -> [a]) 
doIfEqual a b f = if a==b then f a b else [] 

,但這樣做是因爲我們指定a是你jozefg的Eq

doIfEqual (Eq a) => a -> a -> (a -> a -> [a]) 
doIfEqual a b f = if a==b then f a b else [] 
+0

感謝一個實例,這是一個信息並明確解釋。謝謝! –

+0

隨時!享受Haskell – jozefg