在Scala上键入不匹配以便理解
为什么这种结构会导致Scala中出现类型不匹配错误?
for (first <- Some(1); second <- List(1,2,3)) yield (first,second)
<console>:6: error: type mismatch;
found : List[(Int, Int)]
required: Option[?]
for (first <- Some(1); second <- List(1,2,3)) yield (first,second)
如果我用List切换Some,它编译得很好:
for (first <- List(1,2,3); second <- Some(1)) yield (first,second)
res41: List[(Int, Int)] = List((1,1), (2,1), (3,1))
这也很好:
for (first <- Some(1); second <- Some(2)) yield (first,second)
没有找到相关结果
已邀请:
4 个回复
晤默报
或
方法的调用。例如这一个:
成为:
因此,第一个循环值(在这种情况下,
)将接收
方法调用。由于
上的
返回另一个
,因此理解的结果当然是
。 (这对我来说是新的:因为理解并不总是导致流,甚至不一定是在13年代。) 现在,看看
如何在
中声明:
记住这一点。让我们看看错误的理解(具有
的那个)如何转换为一系列地图调用:
现在,很容易看出
调用的参数是根据需要返回
而不是
的东西。 为了解决问题,您可以执行以下操作:
编译得很好。值得注意的是,
不是
的子类型,正如通常所假设的那样。
梆晨灸碾
有意义的情况。也许你有一个
,你想要与某些东西结合得到一个
,用以下函数说:
;你可以写这个,当事情没有“有意义”时得到无:
在一般情况下如何扩展理解实际上是一种相当普遍的机制,将类型为
的对象与函数
结合起来得到类型为
的对象。在您的示例中,M可以是Option或List。一般来说,它必须是相同的类型
。因此,您无法将Option与List结合使用。有关其他可能是
的例子,请查看此特征的子类。 当你开始使用List时,为什么将
与
结合起来?在这种情况下,库在有意义的地方使用更通用的类型。因此,您可以将List与Traversable结合使用,并且存在从Option到Traversable的隐式转换。 底线是:考虑您希望表达式返回的类型,并以该类型作为第一个生成器开始。如有必要,请将其包裹在该类型中。
剑哎
将处理编译器期望第二个为Iterable的情况。我希望编译器魔法根据循环变量的类型而有所不同。
宠封钞轰