问题是有两种数据类型Transaction
和FormatModel
,两者都有formatId
字段。为了防止添加类型签名从formatId
或transaction
获取formatModel
,我创建了类型类HasFormat
:
class HasFormat a where
formatId_ :: a -> FormatId
instance HasFormat Transaction where
formatId_ x = formatId x -- gives error because ambiguous occurrence ‘formatId’
instance HasFormat FormatModel where
formatId_ = formatId -- this works
有人可以解释为什么eta减少实现的实例正在工作而另一个没有?
答案 0 :(得分:6)
重复记录字段的消歧必定是一种尽力而为的事情,因为它需要在类型检查之前发生(在知道标识符之前,通常不能检查表达式其中的名称是指;消除歧义正在做什么。)
您的非工作示例等同于documentation:
中的此非工作示例data S = MkS { x :: Int }
data T = MkT { x :: Bool }
bad :: S -> Int
bad s = x s