elm - 榆树字典与唱片

标签 elm

在实现一个简单的应用程序时,我遇到了尝试更新嵌套记录的问题。我找到了a solution online,但实际上似乎是很多code肿的代码。

当我寻找替代品时,我发现了字典。这似乎是解决该问题的一种方法-如果我在记录中使用字典,则可以避免所有这些ated肿的代码并获得嵌套的更新。

看到字典和记录彼此相邻使我感到奇怪,为什么我要使用记录而不是字典,反之亦然?两者似乎与我真的很相似,所以我不确定我是否能看到彼此的优势。当然,我可以看到语法上有区别,但这就是全部吗?

我在某处了解到,Dict的访问时间复杂度为O(log(n))-是否对键进行二进制搜索? -但是我找不到记录的访问时间复杂度,但是我想知道这是否为O(1),这是优点之一。

无论哪种方式,它们似乎都映射到其他语言中的1个单一数据结构(例如Python的字典,JS对象,Java哈希表),为什么在elm中需要两个?

最佳答案

当来自JavaScript时,Dict和记录可能看起来非常相似,但是在静态类型的语言中,它们实际上是非常不同的。我认为它们唯一的共同之处在于它们都是键值容器。

我认为最大的区别是Dict是同质的,意味着值必须是相同的类型,并且“动态”键入和设置大小,这意味着 key 不会被静态检查(即,在编译时),并且该键值对可以在运行时添加。另一方面,记录在记录类型中包含键名和值类型,这意味着它们可以保存不同类型的值,但是在运行时不能在不更改类型本身的情况下添加或删除键。

当您尝试取回Dict时,很容易就能插入并更新它的好处。 Dict.get返回一个Maybe,然后您必须对其进行处理,因为该类型不能完全保证它包含任何内容。如果键入错误的键名,也不会出现编译器错误。

总体而言,Dict放弃了静态类型化的大部分好处。我认为一个很好的经验法则是,如果您知道键名,则很可能应该使用记录。如果不这样做,请使用Dict

您在性能方面似乎也很正确,但是我认为这是次要的问题。记录访问应等效于按索引访问数组的元素,因为在编译时知道的信息太多,因此实际上可以将其编译为固定大小的数组。

关于elm - 榆树字典与唱片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53356457/

相关文章:

Elm:如何使用 Navigation.newUrl 获取页面加载数据?

elm - 在 let 表达式中使用 elm 进行反跳

elm - "Program is a type parameterized by three type variables: flags, model, and msg"在 Elm 语言中是什么意思?

elm - 有条件地在 Elm 中的表单提交上切换 `preventDefault`

Elm 除了 isTrusted 在 JSON 事件中没有数据

html - 如何将 elm-make .elm 文件转换为 HTML 模板,而不是 HTML 文件?

使用带有 "onmouseover"的 Html.attribute 的 Elm 不起作用

unit-testing - 您如何测试更新功能的 Cmd?

functional-programming - Elm:为 Elm 程序生成信号图