我正在尝试创建一个递归函数,以检查“ 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来检查列表的其余部分,而不是简单地返回False
。
isElement :: Eq a => a -> [a] -> Bool
isElement a [] = False
isElement a (x:xs)
| a == x = True
| otherwise = isElement a xs
请注意,使用编译程序-Wall
会警告您很多事情,包括未使用的变量。特别是,在您的示例中(删除了该where
块之后),它xs
是一个未使用的变量,这应该是一个危险信号,并且在这种情况下,可以使我们对问题有所了解:您从未使用过列表的其余部分,因此列表的其余部分将被忽略。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句