在Haskell的do记法中处理可反驳模式匹配的错误
问题解答
Haskell 里并没有你记忆中那种 Just x <- func a | Nothing -> myfail 的语法写法,你可能混淆了其他语言(比如 Scala)的类似语法。
如果想在 do 记法里处理 Maybe 的两种分支,同时避免单独写 case of,可以用 MaybeT 单子转换器来简化实现:
import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT) example :: a -> m (Maybe b) example a = runMaybeT $ do x <- MaybeT (func a) -- 自动处理 Nothing 分支,直接进入失败逻辑 -- 编写正常处理 x 的业务代码 return x -- 若要自定义失败动作,可结合 MaybeT 的组合子(比如 `mplus`)实现
如果不想引入转换器,也可以在 do 块里借助 <|> 算子简化分支处理:
example :: a -> m (Maybe b) example a = do mb <- func a Just x <- pure mb <|> myfail -- Nothing 时触发自定义失败逻辑 -- 处理 x 的逻辑 return (Just x)
不过最贴合需求的方式还是用 MaybeT,它能让你在 do 记法里像处理普通单子一样处理 Maybe 的成功/失败分支,无需额外的 case of 表达式。
内容的提问来源于stack exchange,提问作者IsAdisplayName
相关产品推荐
相关产品推荐

