Eta reduce和DuplicateRecordFields语言扩展

时间:2017-03-01 13:57:58

标签: haskell

问题是有两种数据类型TransactionFormatModel,两者都有formatId字段。为了防止添加类型签名从formatIdtransaction获取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减少实现的实例正在工作而另一个没有?

1 个答案:

答案 0 :(得分:6)

重复记录字段的消歧必定是一种尽力而为的事情,因为它需要在类型检查之前发生(在知道标识符之前,通常不能检查表达式其中的名称是指;消除歧义正在做什么。)

您的非工作示例等同于documentation

中的此非工作示例
data S = MkS { x :: Int }
data T = MkT { x :: Bool }
bad :: S -> Int
bad s = x s