让我们使用两个函数:
f :: a -> Maybe b
g :: b -> Maybe c
该函数>>=
将以这样的方式工作,仅当它不是时f >>= g
才会执行g
结果。换句话说,它需要两者和才能成功产生任何结果。f
Nothing
f
g
我正在实现一个解析器,并意识到我的词法分析器会从与此相反的情况中受益。那是:
f :: a -> Maybe b
g :: a -> Maybe b
planb :: (a -> Maybe b) -> (a -> Maybe b) -> (a -> Maybe b)
planb f g = \x -> case f x of
Nothing -> g x
res -> res
这意味着尝试f
,如果失败,请尝试g
作为备用计划。使用词法分析器意味着尝试将标记类型与当前输入匹配,如果失败,则尝试匹配另一个标记类型(最终将链接到所有标记类型)。
搜索 Hoogle 并没有产生任何这样的功能,但对我来说,这样的功能似乎在很多地方都很有用!
因此,我的问题是,是否planb
已经存在我应该使用的变体?如果没有,我是否正在做一些非凡的事情,并且有更好的方法来实现我想要的?
PS 我考虑过这样的功能是否对 s 一般有意义,但它对外面的我和其他一些人Monad
来说并没有多大意义。Maybe