elm - 榆树中的字典与记录
问题描述
在实现一个简单的应用程序时,我遇到了尝试更新嵌套记录的问题。我在网上找到了一个解决方案,但它确实看起来像是一大堆臃肿的代码。
当我在寻找替代品时,我找到了字典。这似乎是该问题的解决方案——如果我在记录中使用字典,我可以避免所有臃肿的代码并获得嵌套更新。
看到字典和记录并排出现让我想知道,为什么我要使用记录而不是字典,反之亦然?两者看起来与我非常相似,所以我不确定我是否看到了其中一个的优势。当然,我可以看到语法有所不同,但这就是全部吗?
我在某处了解到 Dict 的访问时间复杂度为 O(log(n)) - 它是否对键进行二进制搜索?- 但我找不到记录的访问时间复杂度,但我想知道这是否是 O(1) 并且这是优势之一。
无论哪种方式,它们似乎都映射到其他语言中的 1 个单一数据结构(例如 Python 的字典、JS 对象、Java 哈希表),为什么我们在 elm 中需要两个?
解决方案
Dict
s 和 records 在来自 JavaScript 时可能看起来非常相似,但在静态类型语言中它们实际上是非常不同的。我认为它们唯一的共同点就是它们都是键值容器。
我认为最大的区别是Dict
s 是同质的,意味着值必须是相同的类型,并且“动态”键控和大小,这意味着键不是静态检查的(即在编译时)并且键值对可以在运行时添加。另一方面,记录在记录类型中包含键名和值类型,这意味着它们可以保存不同类型的值,但也不能在运行时添加或删除键而不改变类型本身。
轻松插入和更新 a 的好处Dict
是您在尝试将其取出时需要付出代价。Dict.get
返回 aMaybe
然后您必须处理它,因为该类型不保证它包含任何内容。如果键入错误的键名,也不会出现编译器错误。
总的来说,aDict
放弃了静态类型的大部分好处。我认为一个好的经验法则是,如果您知道键名,您很可能应该使用记录。如果你不这样做,那就去吧Dict
。
关于性能,您似乎也很正确,但我认为这是次要问题。记录访问应该等同于按索引访问数组的元素,因为在编译时已知太多信息,因此基本上可以将其编译为固定大小的数组。
推荐阅读
- amazon-web-services - 从 Lambda 调用 SSM 文档 - NodeJS - Invalid Instance ID 错误
- php - 在变成 simplexml 对象之前从响应中删除肥皂头
- spring - Spring HATEOAS RepresentationModelAssembler toCollectionModel()
- pdf - Itext HtmlConverter.convertToPdf 将html转换为pdf很慢
- sql - SQL 查询两个 PIVOT 列组合
- c# - 允许 FileSystemWatcher 和 WriteTime/CreationTime 查看子目录?
- python - 将 seq2seq 模型的 TF 1.0 sampled_softmax_loss 函数重新实现到 TF 2 Keras 模型
- sql - R 和 dplyr:如何使用 compute() 在与源模式不同的模式中从 SQL 查询创建持久表?
- python - 为什么xml数据解析为字符串而不是int
- dafny - Dafny 简单断言不成立