在GHC 8中:
{-# LANGUAGE DuplicateRecordFields #-}
data Dog = Dog { name::String }
data Human = Human { name::String }
dog = Dog "Spike"
main = putStrLn $ name dog
此代码无法编译:
Ambiguous occurrence `name'
It could refer to either the field `name', defined at A.hs:4:22
or the field `name', defined at A.hs:3:18
如何正确检索我的狗的名字?
答案 0 :(得分:7)
这应该有效:
main = putStrLn $ name (dog :: Dog)
请参阅DuplicateRecordFields了解详情:
该字段的裸露使用仅指选择器功能,只有在明确无误时才起作用。
和
但是,我们不推断参数的类型来确定数据类型,或者有任何方法可以将选择推迟到约束求解器。
那里的例子与你的非常相似:
bad (p :: Person) = personId p
当范围内有personId
字段的其他记录时,这将无效 - 即使它看起来很明显:(