我在Scala 2.10中遇到了语法问题,无法理解。
< code>for(a
那么为什么for(a
类型检查器抱怨第二个表达式(< code>b
丹尼尔解释了其中的复杂性。但是我想补充一些细节,因为正如你所看到的,我发现这种行为非常不直观,我自己也遇到过几次混合Option
和List
的问题。这特别烦人,因为正如你所看到的,它只在一个方向上工作,而不是另一个。
因此,根据您将拥有的用于理解的规则
def test(a: Option[List[Int]]) = a.flatMap(_.map(identity))
失败与
<console>:7: error: type mismatch;
found : List[Int]
required: Option[?]
def test(a: Option[List[Int]]) = a.flatMap(_.map(identity))
^
但你可以让它工作:
def test(a: Option[List[Int]]) = (a: Iterable[List[Int]]).flatMap(_.map(identity))
test(Some(List(1,2))) // List(1,2)
或使用<code>返回</code>:
for(a <- Some(List(1,2)).toIterable; b <- a) yield b
< code>for应该自己进行这种转换吗?老实说,我不知道,但我和你一样惊讶它不起作用。
我最近解释了这一点——希望有人能找到链接。这是一个反复出现的问题,因此很可能会被关闭。
无论如何,外部发生器控制着表象。这发生在每一层,所以如果我有这个:
for {
a <- A
b <- B
c <- C
} yield f(a, b, c)
那么< code>f(a,B,c)的表示由< code>C控制,其表示由< code>B控制,最终结果的表示由< code>A控制。因此,出于最实际的目的,理解的表征是由第一个发生器控制的。
那么我说的“代表”是什么意思呢?好吧,理解通常是一种单一理解(实际上,它只是对flatMap
和map
等方法的一组调用,因此它可以是任何类型检查)。这意味着给定一个 monad M[A]
和一个函数 A =
这意味着,在大多数情况下,不可能将
选项
和列表
组合在一起进行理解。所有集合在GenTraversableOnce
中都有一个共同的父级,因此将它们组合起来没有问题(尽管事情比引擎盖下要复杂得多)。
但是,存在从< code>Option
到< code>Iterable的隐式转换。既然如此,当Scala找到< code>b时
但是,在第二种情况下不会发生这种情况。使用 Option
进行理解是可以的,因此无需将其转换为可迭代。
不幸的是,人们无法将列表
转换为选项
(这种转换的结果是什么?),这会导致错误。
Scala不会“回溯”到
我衷心建议您查看相关问题,并了解如何翻译理解。
使用 Mercurial 的一个最大好处是, 你可以使用私有本地库来尝试和开发新特性... 如果新特性不管用, 你能在短时间内还原. 失误补救 Mercurial 让你能够尽情尝试. 假设在日常编辑过程中, 你的编辑器发生了异常, 结果你的代码悲剧了: hg revert Note hg revert 将修改的文件恢复到最近一次提交后的状态 非得爱上 emacs 才行吗 (译注: emacs 是
我有两个函数返回期货。我正试图使用for-yield理解将第一个函数的修改结果输入到另一个函数中。 此方法有效: 然而,我对“如果”在那里不满意,似乎我应该能够使用地图。 但是当我尝试使用地图时: 我得到一个编译错误: 我尝试了一些变化,但没有发现任何有吸引力的工作。有人能提出更好的理解和/或解释我的第二个例子的错误吗? 下面是一个最小但完整的Scala 2.10可运行示例:
我阅读了一些用C++创建的项目的技术文档。我发现有一行代码包含我不懂的语法: 我看到关键字,这意味着我们处理别名,但这行是做什么的?我怎么能理解呢?我认为这会创建命名别名并将表达式的结果分配给它。但是这个表达是什么呢?
我试图验证方法的参数是否为空,但我没有找到解决方案。。。 有人可以告诉我该怎么做吗? 我正在尝试这样的事情:
我阅读了一些用C++创建的项目的技术文档。我发现了一行包含我不懂的语法的代码: 我在这里看到关键字。这意味着我们要处理一个别名,但这行是做什么的?我怎么能理解呢?我认为这会创建一个命名别名并将右边表达式的结果分配给它。但是这个表达是什么呢?
任务是实现递归方法,返回 Future 并且由于这一部分("在其他递归(结果::: res,尝试1)")代码失败与错误,因为它期望未来[Seq[结果]],但实际上返回未来[对象]。 据我所知,问题在于yield块内的表达式必须返回Seq[Result],以便将来由Monad进行后续包装。但是“递归(结果::res,尝试1)”将返回未来。因此,不是预期的Seq[Result]收益率,而是包含未来的[