我想知道列表是否是第二个列表的前缀,使用以下代码:
prefix :: [a] -> [b] -> Bool
prefix [] _ = True
prefix _ [] = False
prefix (x:xs) (y:ys) = if (x==y) then prefix xs ys else False
但它返回错误:
Inferred type is not general enough
*** Expression : prefix
*** Expected type : [a] -> [b] -> Bool
*** Inferred type : [a] -> [a] -> Bool
有人可以帮我解决这个问题吗?
答案 0 :(得分:10)
您的类型签名声称两个列表可以有不同的类型,但它们不能。所以编译器抱怨它推断出的类型不如你要求的类型。
答案 1 :(得分:7)
这是因为您使用a
比较了您命名为b
和(x==y)
的类型。检查==
的类型,这意味着它们是相同类型,具有相等性测试:
Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool
因此,推断出的类型签名实际上是Eq a => [a] -> [a] -> Bool
。