elm:使用 foldr 展平列表或数组

elm: flattening lists or arrays using foldr

我正在学习 elm,正在四处寻找 构建一个小型位图编辑器。 它几乎可以工作,但表现出非常奇怪的行为...... 所以在 repl 中尝试了一些东西之后,这种行为似乎 起源于此:展平二维阵列。

假设我创建了这两个 3x3 数组

> import Array exposing (..)

> ones = repeat 3 1 |> repeat 3

Array.fromList 
    [Array.fromList [1,1,1]
    ,Array.fromList [1,1,1]
    ,Array.fromList [1,1,1]]
: Array.Array (Array.Array number)

> grid = initialize 3 <| \j -> initialize 3 <| \i -> (i,j)

Array.fromList 
    [Array.fromList [(0,0),(1,0),(2,0)]
    ,Array.fromList [(0,1),(1,1),(2,1)]
    ,Array.fromList [(0,2),(1,2),(2,2)]]
: Array.Array (Array.Array ( Int, Int ))

在我的例子中 ones 是一个单色位图,但有一个而不是 "#fff"{r=15, g=15, b=15} 在下面产生相同的尴尬结果。 然后我将一些 List.map2 应用于 onesgrid 以生成我的 <rect> 元素。 为此,我使用 Array.foldr 展平了这些二维数组, 在将它们变成列表之前。

这就是...开始的地方:

> flatten plane = plane |> foldr append  (fromList [])
<function> : Array.Array (Array.Array a) -> Array.Array a

> flatten ones |> length
12 : Int

> flatten grid |> length
9 : Int

对列表进行同样的尝试:

>:reset
Environment Reset
> import List exposing (..)

> ones = repeat 3 1 |> repeat 3
[[1,1,1],[1,1,1],[1,1,1]] : List (List number)

> flatten plane = plane |> foldr (++) []
<function> : List (List a) -> List a

> flatten ones |> length
9 : Int

所以这种奇怪的扁平化不会发生在列表中,但它也不会发生在我使用 initialize 创建的数组中...... 那么这是从哪里来的呢???

编辑:正如 Luke Woodward 在下面所建议的,这似乎是当前 Array 实现中的一个错误,请参见 git issue

在我看来,这像是 Elm 的 Array 模块 (Issue with Array.append) 中的错误。

该错误将在 Elm 0.19 中修复。在发布之前,要么使用第三方数组包,例如 Skinney/elm-array-exploration,要么不用 Arrays.