我正在尝试创建一个递归功能,该功能检查以查看" 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
是一个未使用的变量应该是危险信号,在这种情况下,使我们对问题有所了解:您从未使用过列表的其余部分,因此列表的其余部分被忽略。