[英]Haskell isMember function error
isMember:: a -> [a] -> Bool
isMember y [] = False
isMember y (x:xs) =
if y == x then
True
else
isMember y xs
嘗試創建一個函數來識別某些東西是否是列表的成員。 例如:
isMember 6 [1,2,3,4,5,6]
>True
但是我一直得到一個編譯器錯誤,聲明'因使用'=='而導致的(Eq a)沒有實例
幫助將不勝感激(我是函數語言中的Haskell和Recursion的新手,所以解釋為我五歲。)
你快到了
isMember :: Eq a => a -> [a] -> Bool
isMember _ [] = False
isMember y (x:xs) =
if y == x then True else isMember y xs
編譯器告訴您,您承諾接受任何類型的列表成員 - 但稍后您使用函數==
,它不適用於所有類型(例如函數)。
通過添加Eq a =>
您說我接受所有具有等於方法的輸入。
您可以(重新)將最后一行寫為
isMember y (x:xs) = (y == x) || isMember y xs
這相當於你的實現(感謝@chi的評論)。 你的版本有什么好處,它是尾遞歸的。
另一點需要注意 - 模式:
isMember _ [] = False
) isMember y (x:xs) = ...
) 碰巧出現了很多,並被抽象為fold
-functions系列( foldl
, foldr
......)。 把它放在你的用例中就好了
isMember y xs = foldl False (\x b -> (x == y) || b) xs
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.