我是Haskell的新手,正在学习做一些简单的递归函数。我正在研究一个“存在”函数,该函数具有一个值和一个元组。如果给定的值包含在元组中,我应该返回true。香港专业教育学院浏览了类似的其他问题,但找不到解决方案。任何帮助将不胜感激。
我创建了一个辅助函数existsHelper
,该函数接受该值和列表作为参数,并递归检查该值是否存在。我不断收到错误消息,指出“ Couldnt match expecting type [t] -> Bool with actual type Bool
”。
-- exists
exists :: Eq t => t -> [t] -> Bool
exists p [] = False
exists p (c:xs) = if existsHelper p c
then True
else (exists p xs)
-- existsHelper function
existsHelper p [] = False
existsHelper p (x:xs) = if p == x
then True
else existsHelper p xs
一些示例输入/输出
λ> exists 1 []
false
λ> exists 'e' "Hello"
true
λ> exists [4] [[3], [2], [4]]
true
答案 0 :(得分:4)
您存在的函数的类型:
exists :: Eq t => t -> [t] -> Bool
这定义了两个参数-实现Eq
类型类的某种类型的元素和该元素的列表(注意:列表和元组是不同的东西。元组是固定大小的异构集合,而列表具有任意长度所有元素都具有相同的类型)。
您的existsHelper
函数也具有这种类型并实现了所需的行为,因此您可以简单地对其进行重命名:
exists :: Eq t => t -> [t] -> Bool
exists p [] = False
exists p (x:xs) = if (p == x) then True else (exists p xs)