【发布时间】:2019-04-06 16:52:02
【问题描述】:
可扩展记录是 Elm 最令人惊叹的功能之一,但从 v0.16 开始添加和删除字段 is no longer available。这让我处于一个尴尬的境地。
考虑一个例子。我想给一个随机事物命名t,而可扩展记录为我提供了一个完美的工具:
type alias Named t = { t | name: String }
“好的,” 编译器说。现在我需要一个构造函数,即装备具有指定名称的事物的函数:
equip : String -> t -> Named t
equip name thing = { thing | name = name } -- Oops! Type mismatch
编译失败,因为{ thing | name = ... } 语法假定thing 是带有name 字段的记录,但类型系统不能保证这一点。事实上,Named t 我试图表达相反的东西:t 应该是一个记录类型没有它自己的name 字段,并且该函数将此字段添加到记录中。无论如何,实现equip功能需要字段添加。
因此,以多态方式编写equip 似乎是不可能的,但这可能不是什么大问题。毕竟,任何时候我要为一些具体的事情命名,我都可以手动完成。更糟糕的是,反函数extract : Named t -> t(删除命名事物的名称)需要字段删除机制,因此也无法实现:
extract : Named t -> t
extract thing = thing -- Error: No implicit upcast
这将是一个极其重要的功能,因为我有大量接受老式未命名事物的例程,我需要一种将它们用于命名事物的方法。当然,对这些功能进行大规模重构是不合格的解决方案。
最后,经过这么长的介绍,让我陈述我的问题:
现代 Elm 是否提供了一些替代旧的不推荐使用的字段添加/删除语法?
如果没有,是否有像上面的
equip和extract这样的内置函数?对于每个自定义可扩展记录类型,我都希望有一个多态分析器(一个提取其基础部分的函数)和一个多态构造函数(一个将基础部分与附加部分结合并生成记录的函数)。-
对 (1) 和 (2) 的否定答案将迫使我以更传统的方式实现
Named t:type Named t = Named String t在这种情况下,我无法理解可扩展记录的用途。是否有积极的用例,即可扩展记录发挥关键作用的场景?
【问题讨论】:
-
这可能不是一个可行的解决方案,但 Purescript 具有以下功能:pursuit.purescript.org/packages/purescript-record/2.0.2/docs/…
标签: elm