Как отфильтровать значения "Nothing" из массива Elm?
Я хотел бы определить следующую функцию:
compactAndConvertToList : Array (Maybe String) -> List String
Эта функция должна удалить все Nothing
появления в указанном массиве, и преобразовать его в List
,
Я придумала решение ниже, но оно немного грязное.
Есть ли лучший способ добиться этого?
import Graphics.Element exposing (..)
import Array
model : Array.Array (Maybe String)
model = Array.fromList [ Just "Hello", Just "Stack", Nothing, Just "Overflow" ]
compactAndConvertToList : Array.Array (Maybe String) -> List String
compactAndConvertToList maybeStrings =
maybeStrings
|> Array.filter (\x -> x /= Nothing)
|> Array.map (Maybe.withDefault "")
|> Array.toList
main =
model
|> compactAndConvertToList
|> show
2 ответа
Если ваш конечный результат - список, вам, вероятно, лучше просто преобразовать ваш массив в список, а затем работать с ним.
import Array
compactAndConvertToList : Array.Array (Maybe String) -> List String
compactAndConvertToList = Array.toList >> List.filterMap identity
Если вам не нравятся функции высшего порядка, вы можете написать это так:
compactAndConvertToList arr = List.filterMap identity (Array.toList arr)
Мы берем наш массив, применяем toList к нему, затем применяем filterMap с ним. Карта фильтра берет функцию, которая создает значение "возможное", и применяет ее к каждому элементу в списке, отбрасывая Nothing
случаев. Мы просто применяем функции идентичности, которые отбрасывают Nothing
значения, которые уже есть.
В целом, массивы хороши для быстрого произвольного доступа, но если вы просматриваете всю коллекцию несколько раз, списки будут быстрее. Но всегда начинайте с ясного пути, а затем оптимизируйте, если вам нужно.
Может быть, это лучший ответ, как в 2018 году. Используйте пакет elm-community / Maybe -extra.
Пример:
Maybe.Extra.values [Just 1, Nothing, Just 3]
Возвращает:
[1,3]