簡體   English   中英

Haskell是會員功能錯誤

[英]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系列( foldlfoldr ......)。 把它放在你的用例中就好了

isMember y xs = foldl False (\x b -> (x == y) || b) xs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM