如何使用 IO Monad 退出 For-Comprehension
How to exit from For-Comprehension with IO Monad
我想在用户输入 "stop" 并使 readLn 异步时退出并进行无限读取打印循环。
import cats.effect.{ExitCode, IO, IOApp, Timer}
import scala.concurrent.duration._
import scala.io.StdIn
import scala.language.postfixOps
import cats.implicits._
object ReadWrite extends IOApp {
val readLn: IO[String] = IO(StdIn.readLine())
val readWriteName: IO[Nothing] = for {
_ <- IO(println("write your name: "))
name <- readLn
_ <- IO(println(s"Hello, $name"))
t <- name match {
case "stop" => ???
case _ => readWriteName
}
} yield t
def run(args: List[String]): IO[ExitCode] =
for {
_ <- (Timer[IO].sleep(1 millisecond) *> readWriteName).start
_ <- Timer[IO].sleep(100 second)
} yield ExitCode.Success
}
我尝试使用 IO(println(s"Buy Buy"))
但出现错误消息:
Error:(20, 11) type mismatch;
found : t.type (with underlying type Unit)
required: Nothing
} yield t
如何不报错退出?
另外我想在另一个线程中执行IO,例如readLn
。
将 readWriteName
的类型更改为 IO[Unit]
。
val readWriteName: IO[Unit] = for {
_ <- IO(println("write your name: "))
name <- readLn
_ <- IO(println(s"Hello, $name"))
t <- name match {
case "stop" => IO(println(s"Buy Buy"))
case _ => readWriteName
}
} yield t
关于话题请看
尝试
val readWriteName: IO[String] = for {
_ <- IO(println("write your name: "))
name <- readLn
_ <- IO(println(s"Hello, $name"))
_ <- name match {
case "stop" => IO(println(s"Buy Buy"))
case _ => readWriteName
}
} yield name
我想在用户输入 "stop" 并使 readLn 异步时退出并进行无限读取打印循环。
import cats.effect.{ExitCode, IO, IOApp, Timer}
import scala.concurrent.duration._
import scala.io.StdIn
import scala.language.postfixOps
import cats.implicits._
object ReadWrite extends IOApp {
val readLn: IO[String] = IO(StdIn.readLine())
val readWriteName: IO[Nothing] = for {
_ <- IO(println("write your name: "))
name <- readLn
_ <- IO(println(s"Hello, $name"))
t <- name match {
case "stop" => ???
case _ => readWriteName
}
} yield t
def run(args: List[String]): IO[ExitCode] =
for {
_ <- (Timer[IO].sleep(1 millisecond) *> readWriteName).start
_ <- Timer[IO].sleep(100 second)
} yield ExitCode.Success
}
我尝试使用 IO(println(s"Buy Buy"))
但出现错误消息:
Error:(20, 11) type mismatch;
found : t.type (with underlying type Unit)
required: Nothing
} yield t
如何不报错退出?
另外我想在另一个线程中执行IO,例如readLn
。
将 readWriteName
的类型更改为 IO[Unit]
。
val readWriteName: IO[Unit] = for {
_ <- IO(println("write your name: "))
name <- readLn
_ <- IO(println(s"Hello, $name"))
t <- name match {
case "stop" => IO(println(s"Buy Buy"))
case _ => readWriteName
}
} yield t
关于话题请看
尝试
val readWriteName: IO[String] = for {
_ <- IO(println("write your name: "))
name <- readLn
_ <- IO(println(s"Hello, $name"))
_ <- name match {
case "stop" => IO(println(s"Buy Buy"))
case _ => readWriteName
}
} yield name