Dict与榆树记录

问题描述 投票:6回答:1

在实现一个简单的应用程序时,我遇到了尝试更新嵌套记录的问题。我找到了a solution online,但它看起来真的像是一大堆臃肿的代码。

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

看到彼此相邻的字典和记录让我想知道,为什么我会使用记录而不是字典,反之亦然?这两个看起来和我很相似,所以我不确定我是否看到了其中一个的优点。当然,我可以看到语法有所不同,但这就是全部吗?

我在某处了解到Dict的访问时间复杂度是O(log(n)) - 它是否对密钥进行二进制搜索? - 但我无法找到记录的访问时间复杂度,但我想知道这是否是O(1),这是其中一个优点。

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

elm
1个回答
7
投票

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

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

轻松插入和更新Dict的好处是您在尝试将其恢复时付出的代价。 Dict.get返回一个你必须处理的Maybe,因为该类型并不保证它包含任何东西。如果输入密钥的名称输入错误,也不会出现编译器错误。

总的来说,Dict放弃了静态类型的大部分好处。我认为一个好的经验法则是,如果你知道关键名称,你很可能会记录下来。如果你不这样做,请使用Dict

你对性能似乎也是正确的,但我认为这是次要问题。记录访问应该等同于通过索引访问数组的元素,因为在编译时已经知道了很多信息,它实际上可以编译成固定大小的数组。

© www.soinside.com 2019 - 2024. All rights reserved.