检查一下Haskell中的列表中是否存在一个元素



我正在尝试创建一个递归功能,该功能检查以查看" a"是否在数组中。我试图将尾巴的头和" A"进行比较。但是,它不会每次都返回正确的布尔值,因为它只会将尾巴的头扎成一次。我该如何制作此递归?

isElement :: Eq a => a -> [a] -> Bool
isElement a [] = False
isElement a (x:xs)
  | a == x = True
  | otherwise = False
  where x = head(xs)

有几个问题。首先,您的where块什么都没有完成。x已知是列表的头部头,因为它是(x:xs)构造的一部分,它将列表直接摧毁到变量中。因此该线可以完全删除。其次,这里没有实际递归。您需要在错误情况下调用isElement来检查列表的其余部分,而不是简单地返回False

isElement :: Eq a => a -> [a] -> Bool
isElement a [] = False
isElement a (x:xs)
  | a == x = True
  | otherwise = isElement a xs

请注意,将您的程序与-Wall一起编译将为您提供有关许多内容的警告,包括未使用的变量。特别是,在您的示例中(删除where块(,xs是一个未使用的变量应该是危险信号,在这种情况下,使我们对问题有所了解:您从未使用过列表的其余部分,因此列表的其余部分被忽略。

最新更新