3

我正在尝试elem递归地实现该功能。这是我写的:

 member :: Eq a => a -> [a] -> Bool
 member _ [] = False

 member n (x:xs)
     | n == x           = True : member (n xs)
     | otherwise        = False

 main = do
 print (member 10 [1,12,11])

我收到“无法将预期类型 'Bool' 与实际类型 '[a0]' 匹配”错误。

我也尝试使用 if..else..then 进行相同的操作,但徒劳无功。

我想我在这里错过了一个非常基本和基本的 Haskell 概念。

帮助?

对我没有帮助。

4

2 回答 2

10

该子句与声明的返回类型True : member (n xs)不匹配。如果您找到in with ,那么您只想简单地 return 。memberBoolxxsx == nTrue

否则,您应该member使用较小的列表进行递归xs(即再次检查n与下一个元素的相等性)。这是您的代码,已按所述修复了这两个问题:

member n (x:xs) | n == x    = True
                | otherwise = member n xs
于 2012-10-13T23:18:33.073 回答
4
  • 如果您找到了该元素,则答案是True。您似乎正在尝试在那里创建一个列表,不知道为什么......
  • 如果还没有找到,递归并检查尾部...
于 2012-10-13T23:15:33.513 回答