基本上,我想做的手动定义是微不足道的
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'
这没什么大不了的需要时在本地定义 https://github.com/leftaroundabout/timed-media/blob/master/Media/Timed/MiscUtil/Data.hs,但仍然很麻烦,而且如此基本和通用,似乎应该有一个标准实现,但我似乎找不到一个。
也许我只是忽略了一些事情。我想要的似乎与可能的 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
?定义一个自定义幺半群来进行组合?
您可以随时使用
f <$> m <*> n <|> m <|> n
但遗憾的是,这在任何地方都没有规范的实现。
您可以使用reflection
得到那个(a -> a -> a)
“烘焙”为Semigroup
与使用Option
,由semigroups
作为改进版本Maybe
有“正确”的实例Monoid
按照Semigroup
。不过,对于这个问题来说,这有点太严厉了。 =)
也许这应该作为组合器添加到Data.Maybe
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)