有没有比在每个元素上进行map编码更有效的方式来更新Elm列表中的元素?

{ model | items = List.indexedMap (\i x -> if i == 2 then "z" else x) model.items }

也许Elm的编译器足够精巧,可以对此进行优化,以使mapindexedMap不必复制除1之外的每个元素。嵌套列表呢?

Clojure has assoc-in 更新嵌套列表或记录中的元素(也可以组合)。榆树有等效的吗?

最佳答案

而言,更高效的代码会更有效(这类似于@MichaelKohl的答案):

List.take n list ++ newN :: List.drop (n+1) list

PS:如果n为(列表长度-1),则新项目将添加到列表的前面或结尾。

PPS:我似乎记得a :: alist的性能比[a] ++ alist略好。

如果您说的是性能方面的效率/操作数:

一旦列表变大,使用Array(或Dict)代替List作为类型将更加有效。

但是需要权衡:

当您经常检索/更新/添加项目时,
  • ArrayDict非常有效/高效。
  • 经常执行排序和过滤以及实际需要映射整个集合的其他操作时,List的性能很高。

  • 这就是为什么在我的代码中,List是我在view代码中经常使用的原因。在数据方面(在我的update函数中),我更多地使用了DictArray

    09-30 16:58
    查看更多