【发布时间】:2026-02-05 00:20:04
【问题描述】:
Haskell 如何解决“标准化不可变数据结构”问题?
例如,让我们考虑一个表示前女友/男友的数据结构:
data Man = Man {name ::String, exes::[Woman]}
data Woman = Woman {name :: String, exes::[Man]}
如果一个女人改变了她的名字并且她曾经和 13 个男人在一起,会发生什么?那么所有 13 个人也应该“更新”(在 Haskell 意义上)?需要某种规范化来避免这些“更新”。
这是一个非常简单的例子,但是想象一个有 20 个实体的模型,它们之间有任意关系,那该怎么办呢?
用不可变语言表示复杂的规范化数据的推荐方法是什么?
例如,可以在here 找到一个 Scala 解决方案(参见下面的代码),它使用引用。在 Haskell 中可以做什么?
class RefTo[V](val target: ModelRO[V], val updated: V => AnyRef) {
def apply() = target()
}
我想知道,如果更通用的解决方案(如上述解决方案(在 Scala 中))在 Haskell 中不起作用或者它们不是必需的?如果他们不工作,那为什么不呢?我试图在 Haskell 中搜索执行此操作的库,但它们似乎不存在。
换句话说,如果我想在 Haskell 中对规范化的 SQL 数据库进行建模(例如与 acid-state 一起使用),是否有一种通用的方法来描述外键?一般来说,我的意思是,不要按照下面 cmets 中 chepner 的建议手动编码 ID。
编辑:
但换句话说,是否有一个库(用于 Haskell 或 Scala)在内存中实现 SQL/关系数据库(可能还使用事件溯源来实现持久性),这样数据库是不可变的,并且大多数 SQL 操作(查询/join/insert/delete/etc.) 已实现并且类型安全?如果没有这样的图书馆,为什么不呢?这似乎是一个不错的主意。我应该如何创建这样的库?
编辑 2:
一些相关链接:
- https://realm.io/news/slug-peter-livesey-managing-consistency-immutable-models/
- https://tonyhb.gitbooks.io/redux-without-profanity/content/normalizer.html
- https://github.com/agentm/project-m36
- https://github.com/scalapenos/stamina
- http://www.haskellforall.com/2014/12/a-very-general-api-for-relational-joins.html
【问题讨论】:
-
如果你有标准化的数据,你不会有
data Man = Man {name :: String, exes :: [WomanID]},其中womanID是数据结构故事Woman值的索引(类似于Map WomanID Woman?如果你改变Woman值的名称,这不会影响引用它的任何Man值;您只需更新Map中的单个值。 -
@jhegedus 目前的问题有点宽泛——这真的取决于具体情况。如果您不断更新男性和女性,您可能希望在状态单子中执行计算(状态是男性/女性的表格/地图)。如果您正在寻找更通用的图形结构的功能方法,请查看
fgl。关于ID:在某些情况下您可以tie the knot(有时甚至使用Map),但通常您可能需要手动编码ID。 -
一张表代表一个(n个应用)关系; FK 表示如果某个子元组在一个关系中,那么它在另一个关系中。 “用不可变语言表示复杂、规范化数据的方法”与“描述外键的一般方法”有什么关系?另外,为什么“不可变”?这似乎是一条红鲱鱼,因为(正如您引用“更新”所承认但没有解释的那样)问题与状态本身无关(实际上,更新异常的问题实际上只能在 mutable下出现> 语义),但在一定程度上减少了无效数据结构值。
-
我认为这是一个很好的问题,很遗憾看到所有接近投票。我想你会发现这个博文系列(关于“Purely Functional Retrogames”)很有启发性:prog21.dadgum.com/23.html
-
您的困难不是不变性。它缺少一个运算符,它给出的值看起来像另一个值,用新部件替换旧部件。例如,对于记录类型,作为字段的部分存在这样的运算符,并且'“更新”'很简单。例如,对于一个行表,许多行可能会改变。不管可变性。我们遍历一个表示来更新部分。在不变性下具有可以克隆但在可变性下可能克隆。 “规范化”在一般意义上是重组以减少行走和零件的数量。可变性与不变性不是问题。
标签: scala haskell normalization immutability database-normalization