Scala 为了理解io,monad不打印任何内容
我正在用IO monad做实验,这是我写的:Scala 为了理解io,monad不打印任何内容,scala,io,scalaz,Scala,Io,Scalaz,我正在用IO monad做实验,这是我写的: val io: IO[String] = "asdfasdf".pure[IO] val i: IO[Unit] = for{ str <- io } yield { println(str).pure[IO] } i.unsafePerformIO() // Performing io ops 为什么??区别是什么?您刚刚遇到了scala的一个巨大麻烦:推断的单位 for{ str <- io } yield {
val io: IO[String] = "asdfasdf".pure[IO]
val i: IO[Unit] = for{
str <- io
} yield {
println(str).pure[IO]
}
i.unsafePerformIO() // Performing io ops
为什么??区别是什么?您刚刚遇到了scala的一个巨大麻烦:推断的
单位
for{
str <- io
} yield {
println(str).pure[IO]
}
撇开……注意,这种转换似乎是可能的,因为IO[A]
在A
中是不变的。如果将IO
替换为IList
,而不是List
(其类型参数是协变的),则会发生同样的情况,在这种情况下,代码段将不会编译
回到答案…
相反,你应该写:
for {
str <- io
_ <- println(str).pure[IO]
}
yield ()
最后,请注意,这相当于:
io >>= IO.putStrLn
for {
str <- io
_ <- println(str).pure[IO]
}
yield ()
for {
str <- io
_ <- IO(println(str))
}
yield ()
io >>= IO.putStrLn