Я только что сам пишу этот код:В Haskell есть абстракция для <?> -оператора?
import Control.Applicative ((<|>))
x = mA <|> mB <?> c
(<?>) :: Maybe a -> a -> a
Just x <?> _ = x
Nothing <?> y = y
Где mA :: Maybe a
, mB :: Maybe a
, c :: a
и x :: a
. В основном, код говорит: выберите первый вариант, который не empty
, и по умолчанию c
. Вы можете назвать это «reverse Maybe monad», где аналогия с <?>
будет pure
.
Эквивалентно, я мог бы написать
Just x = mA <|> mB <|> pure c,
, но я чувствую себя некомфортно с неопровержимым рисунком. Или, конечно,
x = fromMaybe c (mA <|> mB)
т.к. fromMaybe === flip <?>
.
Оператор <?>
вдохновлен парсеком. Я всегда становлюсь подозрительным, когда обнаруживаю, что я определяю такие функции полезности, как это, но я не мог найти это поведение по умолчанию.
По-видимому, Alternative
и Applicative
недостаточно сильны.
Я пропустил тип-класс?
FWIW: '>' '' parsec' дает читателю понятное для парсера имя. В любом случае это не влияет на фактический синтаксический анализ. – phadej
Итак, действительно '(>) = flip fromMaybe'? Похоже, стандартная библиотека предоставляет то, что вы хотите, просто не совсем в том виде, в котором вы хотели бы быть. Также, конечно, это не часть «Аппликативной» или «Альтернативы», потому что как это работает для других экземпляров, например списков? –
@phadej Вы правы. В parsec '>' не подразумевает дефолт. Поэтому моя аналогия слаба. –