我刚刚发现自己正在编写这段代码:
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 <?>
.
运算符的<?>
灵感来自 parsec。当我发现自己定义了这样的实用函数时,我总是会产生怀疑,但我在任何地方都找不到这种默认行为。
显然Alternative
并Applicative
不够强大。
我错过了一个类型类吗?