问题是关于具有formatId
字段的2种数据类型,Transaction
和FormatModel
。为了防止从transaction
或formatModel
添加类型签名以获取formatId
,我创建了类型类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的实例正在起作用而另一个实例不起作用?
重复记录字段的歧义必然是一种最好的事情,因为它需要在类型检查之前发生在知道什么名称所指的标识者之前;这是歧义在做什么)。
您的非工作示例等同于文档中的这个非工作示例:
data S = MkS { x :: Int }
data T = MkT { x :: Bool }
bad :: S -> Int
bad s = x s