Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala为什么选择';产品';对于';对于';包含或和值定义的表达式_Scala_Type Inference_For Comprehension - Fatal编程技术网

Scala为什么选择';产品';对于';对于';包含或和值定义的表达式

Scala为什么选择';产品';对于';对于';包含或和值定义的表达式,scala,type-inference,for-comprehension,Scala,Type Inference,For Comprehension,如果我使用带有选项的值定义创建了一个用于理解的函数,它将按预期工作: scala> for (a <- Some(4); b <- Some(5); val p = a * b) yield p res0: Option[Int] = Some(20) scala>for(a问题来自val p=a*b 如果你写的更简单 对于(a M[B]和(a=>M[B])=>M[B]。M[a]例程是在is或者[a,B]中定义的。右投影,但是在结果和参数中,我们有或者[a,B],而不是投影

如果我使用带有选项的值定义创建了一个用于理解的函数,它将按预期工作:

scala> for (a <- Some(4); b <- Some(5); val p = a * b) yield p
res0: Option[Int] = Some(20)

scala>for(a问题来自
val p=a*b
如果你写的更简单

对于(a M[B]
(a=>M[B])=>M[B]
M[a]
例程是在is
或者[a,B]中定义的。右投影
,但是在结果和参数中,我们有
或者[a,B]
,而不是投影

第二,翻译《理解》中的
val p=a*b
。Scala参考,6.19 p 90:


生成器p啊,这开始有意义了。你有几个错别字让我一开始就绊倒了(缺少素数,微妙的类型错误,等等)我会很快清理的。上面有趣的结果是,如果我有一致的一元类型,我会很好。因此,如果我只关心正确的投影,我可以创建一个隐式的,像下面这样的,确实解决了这个问题:隐式的def RightProjection[A,B](v:other[A,B]):other.RightProjection[A,B]=v.right再次感谢您的全面编写!我已经阅读了引用,但仍然没有弄清楚发生了什么。显然,在这个简单的示例中,a*b可以移到收益率,但是如果这被复杂的计算所取代,则需要将其传递给返回另一个函数的函数(重复几次),能够使用中间值赋值可以更简洁,然后必须有多个级别的链接for/yield语句。我想我的另一个选择是自己装箱,这与编译器使用选项时的做法非常接近:for(a很抱歉有这么多的打字错误,谢谢你的清理。你也让我意识到了这个问题。我认为隐式转换到右转换非常方便,你仍然可以使用。如果需要的话,可以使用左。
scala> for (a <- Right(4).right; b <- Right(5).right) yield a * b
res1: Either[Nothing,Int] = Right(20)
scala> for (a <- Right(4).right; b <- Right(5).right; val p = a * b) yield p
<console>:8: error: value map is not a member of Product with Serializable with Either[Nothing,(Int, Int)]
for (a <- Right(4).right; b <- Right(5).right; val p = a * b) yield p
                            ^
(p,p′) <- for(x@p<-e) yield {val x′@p′ = e′; (x,x′)}
for((p, pp) <- for(x@p <- Right(5).right) yield{val xx@pp = a*p; (x,xx)}) yield pp
for((p, pp) <- Right(5).right.map{case x@p => val xx@pp = a*p; (x,xx)}) yield pp