在实现一个简单的应用程序时,我遇到了尝试更新嵌套记录的问题。我发现了a solution online,但实际上似乎是很多肿的代码。
在寻找替代品时,我发现了词典。这似乎是解决该问题的一种方法-如果我在记录中使用字典,则可以避免所有all肿的代码并获得嵌套的更新。
看到字典和记录彼此相邻使我感到奇怪,为什么我要使用记录而不是字典,反之亦然?两者似乎与我真的很相似,所以我不确定我是否看到其中一个的优势。当然,我可以看到语法上有区别,但这就是全部吗?
我在某处了解到Dict的访问时间复杂度为O(log(n))-是否对键进行二进制搜索? -但是我找不到记录的访问时间复杂性,但是我想知道这是否为O(1),这是优点之一。
无论哪种方式,它们似乎都映射到其他语言中的1个单一数据结构(例如Python的字典,JS对象,Java哈希表),为什么我们在elm中需要两个?
答案 0 :(得分:7)
Dict
的内容和记录可能看起来非常相似,但是在静态类型的语言中,它们实际上是非常不同的。我认为它们唯一的共同之处在于它们都是键值容器。
我认为最大的区别是Dict
是同质的,这意味着值必须是相同的类型,并且“动态”键入和设置大小,这意味着不会对密钥进行静态检查(即,在编译时,时间),并且可以在运行时添加键值对。另一方面,记录在记录类型中包含键名和值类型,这意味着它们可以保存不同类型的值,但是在运行时不能在不更改类型本身的情况下添加或删除键。
轻松地插入和更新Dict
的好处是您尝试取回它时要付出的代价。 Dict.get
返回一个Maybe
,然后您必须处理该Dict
,因为该类型并不能保证它包含任何内容。如果您键入错误的密钥名称,也不会出现编译器错误。
总体而言,Dict
放弃了静态类型化的大部分好处。我认为一个好的经验法则是,如果您知道键名,则很可能应该使用记录。如果不这样做,请使用this.imp = IJ.openImage(imageFilePath);
imp.show();
。
对于性能,您似乎也很正确,但是我认为这是次要的问题。记录访问应等效于按索引访问数组的元素,因为在编译时知道的信息太多,因此实际上可以将其编译为固定大小的数组。