我有很多“数据”代表数据库中的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实现它,实际上它会变得更复杂。
答案 0 :(得分:3)
有时候将事情分开是最好的。
data Identified a = Identified
{ ident :: !Int
, payload :: a }
现在,您可以以完全统一的方式处理已识别的事物。
答案 1 :(得分:2)
在带有DuplicateRecordFields的GHC 8.0中,您可以对许多数据类型使用相同的记录字段名称。这是OverloadedRecordFields的更大功能的一部分。
第3部分MagicClasses介绍了11
和HasField
的可派生类型类。这与您的UpdateField
类似。
如果您想要数据类型中的字段,则必须在数据类型定义中声明它。除了Template Haskell之外,我不知道任何更改此内容的扩展程序。