Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell唱片公司,更干净的方法?_Haskell_Record - Fatal编程技术网

Haskell唱片公司,更干净的方法?

Haskell唱片公司,更干净的方法?,haskell,record,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 =

我已经阅读了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
(这只做get,而不是set,我当然需要编写更多的代码来做set)

然而,所有这些的类和实例声明看起来像是一个样板,应该可以使用模板haskell或其他东西消除它

有没有GHC的库或扩展可以让这种方法编写起来不那么麻烦?

它似乎封装了很多您需要的东西。在他们的词汇表中,我认为他们的
知道
类型类更接近您的
Has
,并且它还提供了一个用于注入的签名

它们还使用一种标记机制来处理一个我认为您尚未考虑的问题:包含相同类型字段的记录。他们使用类型级别标签来消除歧义

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


在类型魔术师Oleg的作品中,您可以找到更多类型级别标签和其他与记录相关的材料,例如(也有Ralf Lämmel)。

数据访问器模板至少可以帮助编写set/get访问器。也许有些人可以用模板Haskell代码为每个记录字段名生成类和实例。
但是,我自己并不使用Haskell的模板。它将您限制到GHC,甚至限制到特定的GHC版本,因为模板Haskell在不同的GHC版本之间发生变化。每个模块有一条(主要)记录确实是值得的。

这比这要复杂一些,因为这两个字段可能不具有相同的类型。出于我的目的,假设具有相同名称的字段具有相同的类型。我不会让同名字段有不同的类型。你能给我指一些关于
Data.Has
(和
Has TH
)的教程式文档吗。它看起来与我要查找的大致相同,但我不确定如何将其全部组合在一起。实际上,我在
数据中找到了它。Has