首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中使用IO-monad进行理解

在Scala中使用IO-monad进行理解
EN

Stack Overflow用户
提问于 2017-11-22 16:05:01
回答 3查看 1K关注 0票数 3

我的Scala中有以下内容

代码语言:javascript
复制
import scalaz.effect.IO
val i: Iterator[IO[List[String]]] = null

val ii: Iterator[IO[List[String]]] = for{ //This does not compile
  io <- i;
  lst <- io
} yield lst

为什么?怎么了?

我以为iii完全一样。但它拒绝汇编:

代码语言:javascript
复制
Error:(12, 11) type mismatch;
 found   : scalaz.effect.IO[List[String]]
 required: scala.collection.GenTraversableOnce[scalaz.effect.IO[List[String]]]
      lst <- io
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-22 16:38:34

flatMap in scala

回想一下,for-理解只是对flatMap的甜蜜调用。

代码语言:javascript
复制
for {
  a <- expr  //expr must return M[A] such that M has a 
             //flatMap method: flatMap[B](f: A => N[B]) for some N

  b <- f(a)  //f(a) must be an N[B]
  ...

你的问题

这是Iterator.flatMap的签名

代码语言:javascript
复制
def flatMap[B](f: A => GenTraversableOnce[B]): Iterator[B]

但是您试图提供一个返回IO[B]的函数。

代码语言:javascript
复制
lst <- io //You cannot just have `io` on the right here

因此产生了编译错误。

flatMap in scala again

Scala应用于集合类型(和选项)的flatMap <~> for-comprehension转换(在我看来)是令人困惑的,因为它们允许您在不同类型的Monad之间进行切换(例如列表/选项/Set等)。例如,这里的x的类型是什么?

代码语言:javascript
复制
val x = 
  for  {
    i <- List(1, 2, 3)
    j <- Option(i + 1)
    k <- Stream(i, j)
  } yield k

黄曲霉属()单色植物

仔细看看scalaz.MonadflatMap

代码语言:javascript
复制
trait Monad[M[_]] {
  def flatMap[A, B](ma: M[A])(f: A => M[B]): M[B]
}

M的类型总是固定的。也就是说,在这种理解中:

代码语言:javascript
复制
lazy val ma: M[A] = ???
for (a <- ma; b <- f(a)) yield b

对于某些f,函数M[B]的结果类型必须在M[B]中。虽然有时这可能有点烦人,但它的优点是成为完全可预测的。你从不为你的理解而感到困惑。

回到问题

你想要什么并不明显,但以下是一些建议:

代码语言:javascript
复制
i.toStream.sequence.map(flatten) //IO[Stream[String]]
票数 1
EN

Stack Overflow用户

发布于 2017-11-22 16:12:44

iio必须是同一个单子:

代码语言:javascript
复制
io <- i   // i is an Iterator[...]
lst <- io // io is an IO[List[String]]
票数 1
EN

Stack Overflow用户

发布于 2021-11-22 22:00:42

当使用IO和-理解时,一种选择是在您的理解中使用.unsafeToFuture .在您的示例中,这将是:

代码语言:javascript
复制
val ii: Iterator[IO[List[String]]] = for{ 
  io <- i;
  lst <- io.unsafeToFuture()
} yield lst
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47439124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档