Возможно добавить в список в вязе

У меня есть List a и Maybe a, Я хочу добавить значение возможно, если оно Just a но ничего не делать, если это Nothing,

Это то, что я сейчас использую:

aList ++ case maybeValue of
           Just value ->
             [ value ]
           Nothing ->
             []

Есть ли лучший (более идиоматический) способ сделать это?

Обратите внимание, что предварительное добавление тоже хорошо, если вместо этого есть более чистый способ. Порядок списка не имеет значения.

3 ответа

Решение

Я думаю, что вы можете использовать Maybe.map List.singleton yourMaybe |> Maybe.withDefault [],

Здесь у вас есть полный пример:

appendMaybe : List a -> Maybe a -> List a
appendMaybe list maybe =
    Maybe.map List.singleton maybe
        |> Maybe.withDefault []
        |> (++) list

Вы можете попробовать это на Элли

Из предположения Чада, что готовить дешевле

prependMaybe : List a -> Maybe a -> List a
prependMaybe list maybe =
   case maybe of
           Just value ->
             value :: list
           Nothing ->
             list

Если вы собираетесь для краткости, вы можете использовать Maybe.Extra.unwrap от elm-community/maybe-extra пакет:

import Maybe.Extra exposing (unwrap)

consMaybe : List a -> Maybe a -> List a            
consMaybe list =
    unwrap list (flip (::) list)

appendMaybe : List a -> Maybe a -> List a            
appendMaybe list =
    unwrap list ((++) list << List.singleton)

Если вы действительно хотите сходить с ума, вы можете создать свои собственные инфиксные операторы:

infixr 5 ::?
(::?) = flip consMaybe

infixr 5 ++?
(++?) = appendMaybe

Это позволяет следующее:

Nothing ::? [2, 3, 4] == [2, 3, 4]
Just 1  ::? [2, 3, 4] == [1, 2, 3, 4]

[2, 3, 4] ++? Nothing == [2, 3, 4]
[2, 3, 4] ++? Just 5  == [2, 3, 4, 5]

Теперь, являются ли версии инфикса идиоматическим Вязом, это для обсуждения. Если это то, чем вы часто пользуетесь, возможно, оно того стоит, но большинство руководств Elm призывают вас избегать инфиксных операторов, потому что они препятствуют обнаружению.

В конце концов, ваш оригинальный пример имеет то преимущество, что он читабелен и, вероятно, более понятен, так как меньше людей будут знакомы с ним. unwrap, Единственное предложение состоит в том, что если порядок действительно не имеет значения, то добавление элемента в список будет быстрее, чем объединение списков.

Другие вопросы по тегам