我正在尝试创建一个递归函数,检查“a”是否在数组中。我试图抓住尾巴并将其与“a”进行比较。但是,它不会每次都返回正确的布尔值,因为它只接受尾部的头部一次。我怎么做这个递归?
isElement :: Eq a => a -> [a] -> Bool
isElement a [] = False
isElement a (x:xs)
| a == x = True
| otherwise = False
where x = head(xs)
答案 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
是未使用的变量应该是一个红色标志,在这种情况下,我们可以对这个问题有所了解:你从未使用过列表的其余部分,因此列表的其余部分将被忽略。