Elm 《榆树》中的Dict vs Record

Elm 《榆树》中的Dict vs Record,elm,Elm,在实现一个简单的应用程序时,我遇到了试图更新嵌套记录的问题。我发现了,但它似乎真的有很多臃肿的代码 当我在寻找替代品时,我找到了字典。这似乎是该问题的解决方案——如果我在记录中使用字典,我可以避免所有臃肿的代码并获得嵌套的更新 看到字典和唱片挨在一起,我不禁纳闷,为什么我要用唱片而不是字典,反之亦然?这两个似乎真的很相似,所以我不确定我是否看到了其中一个的优点。当然,我可以看出语法上存在差异,但就这些吗 我在某处了解到Dict的访问时间复杂性是O(log(n))--它对键进行二进制搜索吗?--但

在实现一个简单的应用程序时,我遇到了试图更新嵌套记录的问题。我发现了,但它似乎真的有很多臃肿的代码

当我在寻找替代品时,我找到了字典。这似乎是该问题的解决方案——如果我在记录中使用字典,我可以避免所有臃肿的代码并获得嵌套的更新

看到字典和唱片挨在一起,我不禁纳闷,为什么我要用唱片而不是字典,反之亦然?这两个似乎真的很相似,所以我不确定我是否看到了其中一个的优点。当然,我可以看出语法上存在差异,但就这些吗

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


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

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

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

能够轻松插入和更新
Dict
的好处是,当您试图将其取出时,您需要为此付费
Dict.get
返回一个
可能
,然后您必须处理它,因为该类型不能保证它包含任何内容。如果键入的密钥名称错误,也不会出现编译器错误

总的来说,
Dict
放弃了静态键入的大部分好处。我认为一个很好的经验法则是,如果你知道键名,你最有可能使用记录。如果没有,请使用
Dict


你的表现似乎也不错,但我认为这是次要问题。记录访问应该相当于通过索引访问数组的元素,因为在编译时已知的信息太多,所以基本上可以将其编译为固定大小的数组。

是的,这是有意义的。实际上,我遇到了一个“问题”,即值必须是同质的。在我看来,当您有某种键来索引元素时,Dict更像是列表的替代品,而不是记录的替代品。您可以始终使用自定义类型使其包含不同类型的值,但这使得将其返回更加麻烦。是的,编译器建议实际上