美文网首页Haskell
Haskell中基于Monad的条件循环

Haskell中基于Monad的条件循环

作者: DarkBubble | 来源:发表于2018-09-11 22:31 被阅读0次

Haskell在Control.Monad库中提供了类似forM之类的普通循环计算功能,但是没有提供条件循环,但是我们很容易设计出来:

import Control.Monad

whileM :: Monad m => (a -> m Bool) -> [a] -> (a -> m b) -> m [b] 
whileM _ [] _ = return []
whileM cond (x:xs) f = do flag <- cond x
                          if flag 
                          then do y <- f x
                                  ys <- whileM cond xs f
                                  return (y:ys)
                          else return []

假设要实现这么一个功能,解析一组字符串,每组字符串看成一行,如果是空行(实际空行,即不包含任何非空白字符的)则退出,否则读入并且转换为浮点数数组的功能,在GHCi中,加载上述代码后:

>>:{
whileDoM (return . (/= []))
         ["123", "12321", "", "132"]
         (return . (read :: String -> Double))
:}
[123.0, 12321.0]

如果我们想要处理诸如[IO a]这样的交互行为列表(比如尝试从标准输入读入数据)则还需要稍作改进,这里就不赘述了(并不困难)。

相关文章

网友评论

    本文标题:Haskell中基于Monad的条件循环

    本文链接:https://www.haomeiwen.com/subject/cuepgftx.html