Как отфильтровать значения "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]
Другие вопросы по тегам