a b ... 但是,我没-6ren">
gpt4 book ai didi

haskell - 如何在 "continue"循环中使用 `Monad`?

转载 作者:行者123 更新时间:2023-12-03 15:18:41 25 4
gpt4 key购买 nike

很多时候,我发现自己需要在 Haskell 中跳过其余的迭代(如 C 中的 continue):

forM_ [1..100] $ \ i ->
a <- doSomeIO
when (not $ isValid1 a) <skip_rest_of_the_iteration>
b <- doSomeOtherIO a
when (not $ isValid2 b) <skip_rest_of_the_iteration>
...

但是,我没有找到一个简单的方法来做到这一点。我知道的唯一方法可能是 Trans.Maybe ,但是有必要使用单子(monad)变换来实现如此微不足道的事情吗?

最佳答案

请记住,在 Haskell 中这样的循环并不是魔术……它们只是您可以自己编写的普通一流的东西。

对于它的值(value),我认为它没有太大用处 MaybeT作为 Monad 变压器。对我来说,MaybeT只是一个新类型包装器,用于提供 (>>=) 的替代实现...就像你如何使用 Product , Sum , First , And等给出mappend 的替代实现和 mempty .

现在,(>>=)对你来说是IO a -> (a -> IO b) -> IO b .但是拥有 (>>=) 会更有用这里是 IO (Maybe a) -> (a -> IO (Maybe b) -> IO (Maybe b) .一旦您到达返回 Nothing 的第一个操作, ,真的不可能再“绑定(bind)”了。这正是MaybeT给你。您还将获得 guard 的“自定义实例”。 , guard :: Bool -> IO (Maybe a) , 而不是 guard :: IO a .

forM_ [1..100] $ \i -> runMaybeT $ do
a <- lift doSomeIO
guard (isValid1 a)
b <- lift $ doSomeOtherIO a
guard (isValid2 b)
...

就是这样:)
MaybeT也不是魔术,使用嵌套 when可以达到基本相同的效果s。这不是必需的,它只是让事情变得更简单和更干净:)

关于haskell - 如何在 "continue"循环中使用 `Monad`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793110/

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