如何最优处理IO Bool逻辑?探寻IO Bool控制流优化的常用模式
处理IO Bool控制流的简洁模式
你这种场景最常用的简化方式是使用Control.Monad模块里的when函数,它专门用来处理“当布尔条件为真时执行某个 monadic 动作,否则什么都不做”的逻辑,完全可以替代你现在的if-then-else和where结构,让代码更简洁直观。
改写后的代码如下:
import Control.Monad (when) f x = do b <- predicate x when b $ do -- 原来rest里的所有IO操作直接放在这里
when的类型签名是when :: Monad m => Bool -> m () -> m (),它内部已经封装了条件判断的逻辑:当传入的Bool值为True时,执行后面的 monadic 动作;为False时,自动返回return (),和你原来的逻辑完全一致,但代码更紧凑。
如果你的场景需要“条件为假时执行动作”,可以用同模块里的unless函数,用法和when相反。
内容的提问来源于stack exchange,提问作者red-swan
相关产品推荐
相关产品推荐

