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]
这样的交互行为列表(比如尝试从标准输入读入数据)则还需要稍作改进,这里就不赘述了(并不困难)。
网友评论