在let绑定中排名N类型

时间:2015-06-12 22:25:26

标签: haskell gadt

所以我已经这样做了......

nigel :: Person
nigel Name = "Nigel"
nigel Age = 39

然后这......

abigail :: Person
abigail = let x Name = "Abigail"
              x Age = 27 
           in x  

这一切似乎都按预期工作。

我正在努力的是如何在let绑定中定义Person值。例如,这不起作用:

{{1}}

给我:

  

无法将预期类型`t1'与实际类型`[Char]'匹配    `t1'是不可触及的......

有没有办法在let绑定中使这个工作?

1 个答案:

答案 0 :(得分:6)

当涉及GADT时,您需要显式类型注释:

abigail :: Person
abigail = let x :: Person
              x Name = "Abigail"
              x Age = 27 
           in x

没有它,GHC大致看到

let x Name = "Abigail"

并说"好的,xName类型的函数,即PersonField String"Abigail"的类型,即String }。在下一行中,

let x Name = "Abigail"
    x Age = 27

GHC现在发现x也接受PersonField Int并返回一个号码。这与先前推断的类型冲突,触发类型错误。

使用显式类型注释,类型推断不会尝试推断x的错误类型:它是由用户提供的。相反,只会执行类型检查。