我有一个函数检查列表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] - >的类型签名[a] - >布尔
但是,如果我将第一行更改为
containsAll (Eq a):: [a] -> [a] -> Bool
我收到另一个错误:
无效的类型签名:containsAll(Eq a):: [a] - > [a] - >布尔
应为[variable] :: [type]
形式
我在这里做错了什么?
答案 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