我在谈论这个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 ()
答案 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 ()