所以我已经这样做了......
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绑定中使这个工作?
答案 0 :(得分:6)
当涉及GADT时,您需要显式类型注释:
abigail :: Person
abigail = let x :: Person
x Name = "Abigail"
x Age = 27
in x
没有它,GHC大致看到
let x Name = "Abigail"
并说"好的,x
是Name
类型的函数,即PersonField String
到"Abigail"
的类型,即String
}。在下一行中,
let x Name = "Abigail"
x Age = 27
GHC现在发现x
也接受PersonField Int
并返回一个号码。这与先前推断的类型冲突,触发类型错误。
使用显式类型注释,类型推断不会尝试推断x
的错误类型:它是由用户提供的。相反,只会执行类型检查。