首页 > 解决方案 > 榆树中的字典与记录

问题描述

在实现一个简单的应用程序时,我遇到了尝试更新嵌套记录的问题。我在网上找到了一个解决方案,但它确实看起来像是一大堆臃肿的代码。

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

看到字典和记录并排出现让我想知道,为什么我要使用记录而不是字典,反之亦然?两者看起来与我非常相似,所以我不确定我是否看到了其中一个的优势。当然,我可以看到语法有所不同,但这就是全部吗?

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

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

标签: elm

解决方案


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

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

轻松插入和更新 a 的好处Dict是您在尝试将其取出时需要付出代价。Dict.get返回 aMaybe然后您必须处理它,因为该类型不保证它包含任何内容。如果键入错误的键名,也不会出现编译器错误。

总的来说,aDict放弃了静态类型的大部分好处。我认为一个好的经验法则是,如果您知道键名,您很可能应该使用记录。如果你不这样做,那就去吧Dict

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


推荐阅读