То, что я пытаюсь сделать, тривиально определить вручную, в основном
maybeCombine :: (a->a->a) -> Maybe a -> Maybe a -> Maybe a
maybeCombine _ Nothing Nothing = Nothing
maybeCombine _ (Just a) Nothing = Just a
maybeCombine _ Nothing (Just a) = Just a
maybeCombine f (Just a) (Just a') = Just $ f a a'
Это не очень важно для определять это локально, когда это необходимо, но, тем не менее, он является основным и общим, кажется, что должна быть стандартная реализация, но я могу Кажется, он не нашел.
Возможно, я просто что-то пропустил. То, что я хочу, кажется совершенно не связанным с поведением монады, поэтому я считаю, что ничего не найду в ящиках Monad/Arrow; но он точно напоминает экземпляр Monoid
Prelude Data.Monoid > Только "a" < > Nothing
Просто "а"
Prelude Data.Monoid > Просто "a" < > Только "b"
Просто "ab"
...
... который, однако, требует, чтобы a
был само моноидом, т.е. что он в основном имеет a->a->a
"встроенный". Экземпляр MonadPlus
также ведет себя так же, как я хочу, но он просто выбрасывает одно из значений, а не позволяет мне комбинировать функцию
Prelude Data.Monoid Control.Monad > Только 4 `mplus` Nothing
Всего 4 | Prelude Data.Monoid Control.Monad > Nothing `mplus` Just 4
Всего 4 | Prelude Data.Monoid Control.Monad > Просто 4 `mplus` Всего 5
Всего 4
Каким будет каноническое решение? Локальное сопоставление шаблонов? Что-то с комбинаторами из, например, Data.Maybe
? Определение пользовательского моноида для объединения?