Haskell如何解决“规范化不可变数据结构”问题?
例如,让我们考虑一个表示前女友/男友的数据结构:
data Man = Man {name ::String, exes::[Woman]}
data Woman = Woman {name :: String, exes::[Man]}
如果一个女人改变了她的名字并且她已经和 13 个男人在一起了,会发生什么?那么所有 13 个人也应该被“更新”(在 Haskell 意义上)?需要某种标准化来避免这些“更新”。
这是一个非常简单的例子,但是想象一个具有 20 个实体的模型,以及它们之间的任意关系,那么该怎么办?
用不可变语言表示复杂的标准化数据的推荐方法是什么?
例如,可以找到Scala解决方案here https://github.com/suzaku-io/diode/blob/0e443dec08313ff4cc81fcbab71eb31a8dce6632/doc/usage/ApplicationModel.md(参见下面的代码),并且它使用引用。去哈斯克尔可以玩什么?
class RefTo[V](val target: ModelRO[V], val updated: V => AnyRef) {
def apply() = target()
}
我想知道,像上面的解决方案(在 Scala 中)这样的更通用的解决方案是否在 Haskell 中不起作用或者没有必要?如果它们不起作用,那为什么不呢?我试图搜索在 Haskell 中执行此操作的库,但它们似乎不存在。
换句话说,如果我想在 Haskell 中对标准化 SQL 数据库进行建模(例如与酸性状态 https://hackage.haskell.org/package/acid-state)有描述外键的通用方法吗?一般来说,我的意思是,不要按照 chepner 在下面的评论中建议的那样手动编码 ID。
EDIT:
换句话说,是否有一个库(用于 Haskell 或 Scala)在内存中实现 SQL/关系数据库(可能还使用事件源进行持久化),使得数据库是不可变的并且大多数 SQL 操作(查询/连接/插入/删除/等)已实现并且类型安全?如果没有这样的图书馆,为什么不呢?这似乎是一个非常好的主意。我应该如何创建这样一个库?
EDIT 2:
一些相关链接:
- https://realm.io/news/slug-peter-livesey-managing-consistency-immutable-models/ https://realm.io/news/slug-peter-livesey-managing-consistency-immutable-models/
- https://tonyhb.gitbooks.io/redux-without-profanity/content/normalizer.html https://tonyhb.gitbooks.io/redux-without-profanity/content/normalizer.html
- https://github.com/agentm/project-m36 https://github.com/agentm/project-m36
- https://github.com/scalapenos/stamina https://github.com/scalapenos/stamina
- http://www.haskellforall.com/2014/12/a-very-general-api-for-relational-joins.html http://www.haskellforall.com/2014/12/a-very-general-api-for-relational-joins.html