如何消除选择器功能的歧义?

时间:2016-05-23 15:35:56

标签: haskell ghc

在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

如何正确检索我的狗的名字?

1 个答案:

答案 0 :(得分:7)

这应该有效:

main = putStrLn $ name (dog :: Dog)

请参阅DuplicateRecordFields了解详情:

  

该字段的裸露使用仅指选择器功能,只有在明确无误时才起作用。

  

但是,我们不推断参数的类型来确定数据类型,或者有任何方法可以将选择推迟到约束求解器。

那里的例子与你的非常相似:

  

bad (p :: Person) = personId p

当范围内有personId字段的其他记录时,这将无效 - 即使它看起来很明显:(