在下面的代码中,我得到了错误
无法将类型“ Integer”与“ Int”匹配
预期的类型:[(测试,[测试])]
实际类型:[([Integer,[Integer])]
执行时
testFunc test
带有以下声明
type TestType = Int
a = [(1,[2,3])]
testFunc :: [(TestType ,[TestType])] -> TestType
testFunc ((a,(b:c)):d) = a
如何声明列表a
,使其与testFunc
的类型匹配?
有没有一种方法可以解决该错误而无需修改type Test = Int
或声明a
?
答案 0 :(得分:4)
如何声明列表“ test”,使其与testFunc的类型匹配?
好吧,将其声明为类型。
a :: [(TestType, [TestType])]
a = [(1,[2,3])]
通常来说,您应该始终为此类顶级定义提供显式类型签名。没有这样的签名,编译器会为您选择一个。通常,Haskell会尝试选择最通用的类型。在这种情况下,将是
a :: (Num a, Num b) => [(a, [b])]
...将同时包含[(Int, [Int])]
和[(Integer, [Integer])]
。但是,monomorphism restriction默认限制类型,但不包括此类多态性。因此,GHC必须选择一个版本,默认版本为Integer
,而不是Int
。
正确的解决方案还是提供一个明确的签名。但是,您也可以关闭单态限制:
{-# LANGUAGE NoMonomorphismRestriction #-}
type TestType = Int
a = [(1,[2,3])]
testFunc :: [(TestType ,[TestType])] -> TestType
testFunc ((x,(y:z)):w) = x
main :: IO ()
main = print $ testFunc a