更改变量类型以匹配期望的类型

时间:2019-03-13 13:54:38

标签: haskell types type-mismatch

在下面的代码中,我得到了错误

  

无法将类型“ 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

1 个答案:

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