更新Elm列表中元素的更有效方法?

at.*_*at. 5 list elm

有没有比map遍历每个元素更有效的方法来更新Elm列表中的元素?

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

也许榆木的编译器是复杂的,足以优化这个让mapindexedMap不被不必要地复制过的每一个元素,除了1.什么嵌套列表?

Clojure必须assoc-in更新嵌套列表或记录中的元素(也可以合并)。榆树有同等学历吗?

win*_*elt 4

代码量而言更有效的是(这类似于@MichaelKohl的答案):

List.take n list ++ newN :: List.drop (n+1) list
Run Code Online (Sandbox Code Playgroud)

PS:如果 n < 0 或 n > (列表长度 - 1),则新项目将添加到列表之前或末尾。

PPS:我似乎记得它的a :: alist性能比[a] ++ alist.

如果您指的是性能/操作数量方面的高效:

一旦您的列表变大,使用 an Array(或 a Dict)而不是 List 作为您的类型会更有效。

但有一个权衡:

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

这就是为什么在我的代码中,List我在代码中经常使用它view。在数据方面(在我的update函数中)我使用Dict等等Array