Haskell 如何消除选择器函数的歧义?

Haskell 如何消除选择器函数的歧义?,haskell,ghc,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', defin

在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
如何正确检索我的狗的名字?

这应该可以:

main = putStrLn $ name (dog :: Dog)
详情请参阅:

字段的简单用法仅指选择器函数,并且仅在明确无误的情况下才起作用

但是,我们不能推断参数的类型来确定数据类型,也不能将选择推迟到约束解算器

这里的例子与您的非常相似:

bad(p::Person)=personId p


当范围中有另一条记录带有
personId
字段时,这将不起作用-即使它看起来很明显:(

参见引文…你是对的,但这不是它的工作原理/推断-如果你使用签名,通常没有问题哦,我相信这种语言扩展将是我最喜欢的语言之一!是的,它非常混乱…我想我不会使用它(在同一模块中)这仅仅是GHC 8.0吗?@chi很明显,我没有能力回答这个问题,但我链接的页面上说“这是作为​Phab:D761和​Phab:D1391,将采用GHC 8.0版本。”因此,我会将其解释为是的-目前可能只有8.x,模糊的记录字段…不知道这个混乱的修复扩展链是否是无限的?如果是的,我们是否需要一个
disambiguateRecordFieldsDisambigurationExtension
extension?-…请务必检查,这将使这些扩展完全不必要。-(FTR:我不认为这些扩展的编写者做得不好,事实上,我过去使用过
记录通配符
,并且发现它工作得相当好。不过,我敢说这总体上不是正确的方法。)