Scala 为了理解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 {

我正在用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 {
  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