Dict与榆树记录

Nic*_*tti 7 elm

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

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

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

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

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

gle*_*nsl 9

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

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

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

总的来说,Dict放弃静态打字的大部分好处.我认为一个好的经验法则是,如果你知道关键名称,你很可能会记录下来.如果你不这样做,那就去吧Dict.

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