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

时间:2018-02-08 23:56:15

标签: 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)

1 个答案:

答案 0 :(得分:4)

有几个问题。首先,您的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是未使用的变量应该是一个红色标志,在这种情况下,我们可以对这个问题有所了解:你从未使用过列表的其余部分,因此列表的其余部分将被忽略。