Haskell记录,清洁方法?

Cli*_*ton 12 haskell record

我已经阅读了Haskell记录的一些问题,特别是同一模块中的两个元素不能具有相同名称的事实.

我知道你可以通过单独的模块解决这个问题,但我不想这样做,而是尝试了这种方法:

class HasX a where
  x :: a -> X

data D1 = D1 { d1_x :: X, ... }
instance HasX D1 where
  x = d1_x

data D2 = D2 { d2_x :: X, ... }
instance HasX D2 where
  x = d2_x
Run Code Online (Sandbox Code Playgroud)

(这只是获取,而不是设置,我当然需要编写更多代码来做集合).

但是,似乎所有这些的类和实例声明看起来像样板文件,应该可以使用模板haskell或其他东西来消除.

是否存在GHC的库或扩展,使得这种方法不那么混乱?

Sco*_*est 6

似乎Data.Has封装了很多你正在寻找的东西.在他们的词汇中,我认为他们的Knows类型更接近你的类型Has,它也提供了注射的签名.

他们还使用标签机制来处理我认为您尚未考虑过的问题:包含具有相同类型的字段的记录.他们使用类型级标签来消除歧义.

为方便起见,似乎还有一些支持为Has-TH中的Has模板Haskell 提供实例生成器

您可以在Oleg the Type Magician的作品中找到更多类型级别的标签和其他与唱片相关的材料,如OOHaskell(也与RalfLämmel合作).