У меня есть изображение, сохраненное как очень большое List Int
, и я хотел бы превратить его в List Color
Однако помните, что rgb требует 3 аргумента, а rgba требует 4. Итак, давайте попробуем:
toColor : List Int -> List Color
toColor x =
if List.isEmpty x then
[]
else
List.append ( rgba <| List.take 4 x ) ( toColor <| List.drop 4 x )
Это определение является рекурсивным. Мы грызем 4 числа, создаем цвет rgb и добавляем результаты. Однако, если x
равно List Int
, мы не можем написать это:
rgba <| List.take 4 x
Вот такую ошибку мы получаем. rgb
ожидает три числа, а вместо этого получает список
71| rgb <| List.take 4 x
^^^^^^^^^^^^^
(<|) is expecting the right argument to be a:
Int
But the right argument is:
List a
Интересно, что удаление первого элемента из List Int
а> возвращает Maybe Int
head : List a -> Maybe a
> head [1,2,3,4]
Just 1 : Maybe.Maybe number
Вот модификация rgb, которая превращает 3 Maybe Int
в Color
. Теперь, читая данные изображения, я думаю, что rgba необходим, но я просто добавляю еще один.
rgb' : Maybe Int -> Maybe Int -> Maybe Int -> Color
rgb' a b c =
case a of
Nothing -> rgb 0 0 0
Just a' -> case b of
Nothing -> rgb 0 0 0
Just b' -> case c of
Nothing -> rgb 0 0 0
Just c' -> rgb a' b' c'
это началось, когда я переводил этот пример d3js на Elm и заметил, что в нем используются некоторые функции, которые не t в настоящее время поддерживается в Elm. В частности, ctx.getImageData()
, поскольку вы не можете импортировать изображения и изображения в Canvas. Так что это часть моего импровизированного решения.
Array
тип, который, как я думал, может быть упрощен с помощью списка, но, похоже, тот же самый :-/ - person john mangual   schedule 16.06.2016