无法与预期类型匹配

时间:2019-09-05 22:15:16

标签: haskell

我是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

1 个答案:

答案 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)