Haskell无效的类型签名:containsAll(Eq a):: ...应该是<variable> :: <type>

时间:2017-03-19 16:43:41

标签: haskell functional-programming

我有一个函数检查列表l2是否包含l1的每个元素。

containsAll :: [a] -> [a] -> Bool    -- here I get the error
containsAll []     _        = True
containsAll (x:xs) []       = False
containsAll (x:xs) b
      | (elem x b)          = containsAll xs b
      | otherwise           = False

这是我得到的错误:

  

使用'elem'

时没有(Eq a)的实例      

可能的解决方法:    将(Eq a)添加到上下文中      containsAll :: [a] - &gt;的类型签名[a] - &gt;布尔

但是,如果我将第一行更改为

containsAll (Eq a):: [a] -> [a] -> Bool

我收到另一个错误:

  

无效的类型签名:containsAll(Eq a):: [a] - &gt; [a] - &gt;布尔

     

应为[variable] :: [type]

形式

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

您的订单有点错误。类型约束的正确签名格式是:

[variable] :: ([constraint1], [constraint2], ...) => [type]

所以你的签名应该是:

containsAll :: (Eq a) => [a] -> [a] -> Bool

或者,因为只有一个约束:

containsAll :: Eq a => [a] -> [a] -> Bool

但是,正如n.m提到的那样,GHCi的:t命令在确定类型时通常很有用。

如果您是初学者并且您遇到类型签名和类型类的问题,我会建议this chapter of LYAH.

答案 1 :(得分:0)

您也可以将代码重构为;

containsAll :: Eq a => [a] -> [a] -> Bool
containsAll [] _ = True
containsAll _ [] = False
containsAll (x:xs) ys = (elem x ys) && containsAll xs ys