elm: выравнивание списков или массивов с помощью Foldr - PullRequest
0 голосов
/ 02 июня 2018

Я изучаю вяз и бездельничал, пытаясь создать небольшой редактор растровых изображений.Это почти работает, но демонстрирует очень странное поведение ... Так что после попытки что-то сделать в реплее, это поведение, похоже, происходит здесь: в выравнивании 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 к 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, тоже не бывает ... так откуда же это взято ???

EDIT: как предложено Люком Вудвордом ниже, это кажется ошибкой в ​​текущей реализации Arrayсм. Git Issue .

1 Ответ

0 голосов
/ 03 июня 2018

Это похоже на ошибку в модуле Array вяза ( Проблема с Array.append ).

Ошибка будет исправлена ​​в Elm 0.19.Пока это не будет выпущено, либо используйте сторонний пакет массивов, такой как Skinney/elm-array-exploration, либо обойдитесь без Array s.

...