gpt4 book ai didi

haskell - B计划,或者与Maybe的>>=相反的是什么?

转载 作者:行者123 更新时间:2023-12-03 13:57:13 24 4
gpt4 key购买 nike

让我们使用两个函数:

f :: a -> Maybe b
g :: b -> Maybe c

函数 >>=会以 f >>= g 的方式工作将执行 g结果为 f仅当它不是 Nothing .换句话说,它需要两个 fg成功产生任何结果。

我正在实现一个解析器,并意识到我的词法分析器会从与此相反的情况中受益。那是:
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作为备用计划。使用词法分析器意味着尝试将 token 类型与当前输入匹配,如果失败,则尝试匹配另一个 token 类型(最终将链接到所有 token 类型)。

搜索 Hoogle 并没有产生任何这样的功能,但对我来说,这样的功能似乎在很多地方都很有用!

因此,我的问题是, planb 的变体是否我应该使用的已经存在?如果没有,我是否正在做一些非凡的事情,并且有更好的方法来实现我想要的?

附言我想过这样的功能是否对 Monad有意义一般是 s,但在 Maybe 之外对我来说没有多大意义也许还有其他几个。

最佳答案

Alternative typeclass 正是这样做的,它与 MonadPlus 非常相似但也许更笼统一些。

import Control.Applicative

-- most general form
planb :: (Applicative g, Alternative f) => g (f a) -> g (f a) -> g (f a)
planb = liftA2 (<|>)

-- specialized to (->) and Maybe
planb' :: (a -> Maybe b) -> (a -> Maybe b) -> (a -> Maybe b)
planb' = planb

-- equivalent to planb' (and planb) but without the fancy combinators
planb'' :: (a -> Maybe b) -> (a -> Maybe b) -> a -> Maybe b
planb'' f g x = f x <|> g x

将其插入一个简单的测试用例:
test :: Maybe Int
test = do
a <- planb' (const Nothing) id (Just 1)
b <- planb' id id (Just 1)
c <- planb' id (const Nothing) (Just 1)
return $ a + b + c

生成预期结果:
*Main> test
Just 3

关于haskell - B计划,或者与Maybe的>>=相反的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24902463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com