如何简单地将所有“数据”定义与字段的类型和名称相同?

时间:2016-04-03 04:47:50

标签: haskell

我有很多“数据”代表数据库中的sql表。

    data User = User { userId :: Int, userName :: String }
    data Article = Article { articleId :: Int, articleTitle :: String, articleBody :: String }
-- .......

所有这些都将字段“id”作为主键。我想知道,有没有办法摆脱每次为每个“数据”定义它的必要性,我能不能简化它?如果这样做:

class DataTable a where 
  myId :: Int

它不会改变任何东西,会吗?我仍然需要为每个数据定义“id”,然后为DataTable实现它,实际上它会变得更复杂。

2 个答案:

答案 0 :(得分:3)

有时候将事情分开是最好的。

data Identified a = Identified
  { ident :: !Int
  , payload :: a }

现在,您可以以完全统一的方式处理已识别的事物。

答案 1 :(得分:2)

在带有DuplicateRecordFields的GHC 8.0中,您可以对许多数据类型使用相同的记录字段名称。这是OverloadedRecordFields的更大功能的一部分。

第3部分MagicClasses介绍了11HasField的可派生类型类。这与您的UpdateField类似。

如果您想要数据类型中的字段,则必须在数据类型定义中声明它。除了Template Haskell之外,我不知道任何更改此内容的扩展程序。