【发布时间】:2013-10-31 12:25:17
【问题描述】:
我想要做的基本上是手动定义是微不足道的
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'
这对define this locally when needed 来说没什么大不了的,但仍然很麻烦,而且如此基本和通用,似乎应该有一个标准的实现,但我似乎找不到。
也许我只是忽略了一些东西。我想要的似乎与也许 monad 的行为完全无关,所以我想我不会在 Monad/Arrow 抽屉里找到任何东西;但它确实类似于 Monoid 实例
Prelude Data.Monoid> 只是“a” 没有
只是“一个”
Prelude Data.Monoid> 只是“a”只是“b”
只是“ab”
...
...然而,它要求a 本身就是一个幺半群,即它基本上具有a->a->a“内置”。 MonadPlus 实例的行为也很像我想要的,但它只是丢弃了其中一个值,而不是允许我提供组合函数
Prelude Data.Monoid Control.Monad> 仅 4 `mplus` 无
只有 4 个
Prelude Data.Monoid Control.Monad> 没有 `mplus` 只是 4
只有 4 个
Prelude Data.Monoid Control.Monad> 仅 4 `mplus` 仅 5
只有 4 个
规范的解决方案是什么? 本地模式匹配?来自例如组合器的东西Data.Maybe?定义一个自定义幺半群来进行组合?
【问题讨论】: