是否可以通过 IO 循环理解

Is it possible to loop for comprehension with IO

我说的是这个 Haskell 例子:

main = do   
    line <- getLine  
    if null line  
        then return ()  
        else do  
            putStrLn $ reverseWords line  
            main  

是否可以使用 IO monad 在 scala 中翻译它?

而不是 return 我想使用 if 来理解。我真的不确定用递归调用循环它。听起来scala不允许这样做。如果不是,正确的做法是什么?

而且 IO 似乎没有 filter,即使这样也行不通:

import scalaz._
import effect._
import IO._

for {
   line <- readLn if !line.empty
   _ <- putStrLn(line)
} yield ()

在 scala 中是可能的,因为 if 子句在 scala 中也是惰性的。不过,其他涉及惰性评估的技巧可能并不那么直观。

import scalaz._, effect._, IO._

def main: IO[Unit] = for {
  line <- readLn
  _ <- if (line.isEmpty) {
    Monad[IO].point(())
  } else {
    for {
      _ <- putStrLn(line)
      _ <- main
    } yield ()
  }
} yield ()