我想要做的是手动定义微不足道,基本上
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 的行为完全无关,所以我想我不会在 Monad/Arrow 抽屉里找到任何东西;但它确实类似于Monoid
实例
Prelude Data.Monoid> Just "a" <> Nothing
Just "a"
Prelude Data.Monoid> Just "a" <> Just "b"
Just "ab"
...
...但是a
它本身需要是一个幺半群,即它基本上具有a->a->a
“内置”。该MonadPlus
实例的行为也很像我想要的,但它只是丢弃了其中一个值,而不是允许我提供组合函数
Prelude Data.Monoid Control.Monad> Just 4 `mplus` Nothing
Just 4
Prelude Data.Monoid Control.Monad> Nothing `mplus` Just
4
Prelude Data.Monoid Control.Monad> Just 4 `mplus` Just 5
Just 4
什么是规范的解决方案?本地模式匹配?来自例如的组合器的东西Data.Maybe
?定义一个自定义幺半群来进行组合?