ETA减少和重复的语言扩展

  • 本文关键字:语言 扩展 ETA haskell
  • 更新时间 :
  • 英文 :


问题是关于具有formatId字段的2种数据类型,TransactionFormatModel。为了防止从transactionformatModel添加类型签名以获取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

最新更新