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
应用于 ones
和 grid
以生成我的 <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
,要么不用 Array
s.
。
我正在学习 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
应用于 ones
和 grid
以生成我的 <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
,要么不用 Array
s.