是否可以通过 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 ()
我说的是这个 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 ()