1
這塊的Haskell代碼:哈斯克爾,輸入參數,返回類型
isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
這是一個函數的定義,我相信。我如何理解輸入參數是什麼以及返回類型是什麼?
例如:什麼是(Eq a)
?
這塊的Haskell代碼:哈斯克爾,輸入參數,返回類型
isIn :: (Eq a) => [a] -> [a] -> Bool
needle `isIn` haystack = any (needle `isPrefixOf`) (tails haystack)
這是一個函數的定義,我相信。我如何理解輸入參數是什麼以及返回類型是什麼?
例如:什麼是(Eq a)
?
Eq
就是所謂的typeclass。它聲明瞭一些函數,在這種情況下==
和朋友,我們可以爲那些爲==
和其他提供定義的類型類實例。
這意味着當我們有類似於Eq
typeclass的實例時,我們知道我們可以在其上使用==
。
這裏的訣竅是,在我們的函數中,我們需要有可以檢查它們是否相等的類型。如果我們只有[a] -> [a] -> Bool
那麼我們會遇到麻煩,因爲我們只是承諾我們的實現在沒有==
運算符的情況下運行,而不運行它。
因此,我們使用=>
這增加了我們的函數定義的上下文。它說類似「這將適用於任何a
只要a
是Eq
類型類別的一個實例」。這樣,我們可以安全地使用==
,並且知道我們所有的參數類型都會適當地執行它。
快速插圖
這是一個錯誤:
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 []
感謝一個實例,這是一個信息並明確解釋。謝謝! –
隨時!享受Haskell – jozefg