gpt4 book ai didi

haskell - 提前退出 mapM 的更惯用方式

转载 作者:行者123 更新时间:2023-12-04 23:15:09 26 4
gpt4 key购买 nike

给定返回 m (Maybe a) 的操作列表我正在尝试返回 m (Maybe [a])如果任何单个结果是 Nothing整个结果是 Nothing . m包含 StateT我想避免在第一个 Nothing 之后运行任何操作被退回。

正在尝试使用 mapM然后移动 Maybe列表之外的所有操作都会运行。

我有这个解决方案,但是嵌套的 case 语句只有很多包装和展开让我觉得可能有一种更优雅的方式来做到这一点。通常,当我有这种感觉时,会有一种具有更通用类型的单衬线,它可以做完全相同的事情。

有什么建议?

myMapM' :: Monad m => (t1 -> m (Maybe t)) -> [t1] -> m (Maybe [t])
myMapM' f [] = return (Just [])
myMapM' f (a:as) = do
r <- f a
case r of
Nothing -> return Nothing
Just g -> do
rs <- myMapM' f as
case rs of
Nothing -> return Nothing
Just gs -> return (Just (g:gs))

最佳答案

您想要的行为是 the monad transformer MaybeT 的行为.

myMapM :: Monad m => (t1 -> m (Maybe t)) -> [t1] -> m (Maybe [t])
myMapM f = runMaybeT . mapM (MaybeT . f)

关于haskell - 提前退出 mapM 的更惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44202878/

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