Возможно добавить в список в вязе
У меня есть 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
, Единственное предложение состоит в том, что если порядок действительно не имеет значения, то добавление элемента в список будет быстрее, чем объединение списков.