小编Ben*_*eer的帖子

为什么Scala for-comprehension必须从生成器开始?

根据Scala语言规范(第6.19节),"枚举器序列始终以生成器开始".为什么?

我有时会发现这个限制在使用for-adrehension与monad 时是一个障碍,因为这意味着你不能做这样的事情:

def getFooValue(): Future[Int] = {
  for {
    manager = Manager.getManager() // could throw an exception
    foo <- manager.makeFoo() // method call returns a Future
    value = foo.getValue()
  } yield value
}
Run Code Online (Sandbox Code Playgroud)

实际上,scalac拒绝此错误消息'<-' expected but '=' found.

如果这是Scala中的有效语法,一个优点是抛出的任何异常Manager.getManager()都会被-comprehension中Future使用的monad for捕获,并且会导致它产生失败Future,这就是我想要的.将呼叫转移到Manager.getManager()外部for理解的解决方法没有这个优势:

def getFooValue(): Future[Int] = {
  val manager = Manager.getManager()

  for {
    foo <- manager.makeFoo()
    value = foo.getValue()
  } yield value …
Run Code Online (Sandbox Code Playgroud)

monads haskell scala

2
推荐指数
1
解决办法
814
查看次数

标签 统计

haskell ×1

monads ×1

scala ×1