是否有可能循环以理解IO

时间:2016-01-23 23:14:48

标签: scala haskell scalaz

我在谈论这个Haskell示例:

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

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

而不是返回,我想在for-comprehension中使用if。我真的不确定用递归调用来循环它。听起来斯卡拉不允许这样做。如果没有,这样做的正确方法是什么?

似乎IO没有filter,即使这不起作用:

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

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

1 个答案:

答案 0 :(得分:3)

它可能在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 ()