有没有比在每个元素上进行map
编码更有效的方式来更新Elm列表中的元素?
{ model | items = List.indexedMap (\i x -> if i == 2 then "z" else x) model.items }
也许Elm的编译器足够精巧,可以对此进行优化,以使
map
或indexedMap
不必复制除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作为类型将更加有效。但是需要权衡:
当您经常检索/更新/添加项目时,
Array
和Dict
非常有效/高效。 List
的性能很高。 这就是为什么在我的代码中,
List
是我在view
代码中经常使用的原因。在数据方面(在我的update
函数中),我更多地使用了Dict
和Array
。