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

时间:2018-06-02 15:53:32

标签: arrays elm flatten

我正在学习榆树,正在努力学习 构建一个小位图编辑器。 它几乎有效,但显示出非常奇怪的行为...... 因此,在repl中尝试填充之后,这种行为似乎就出现了 来源于此:在展平2D数组时。

假设我创建了这两个 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展平了这些2D数组, 在将它们转到列表之前。

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

> 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所建议的那样,这似乎是当前数组实现中的一个错误,请参阅git issue

1 个答案:

答案 0 :(得分:4)

这对我来说就像是榆树Array模块中的一个错误(Issue with Array.append)。

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