元组和产量:非常常见的结构。但令我惊讶的是,将它们组合在一起并不是很明显如何才能完成工作:
val edges = ((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10),
(1,7),(4,10))
val edgesw = for (e <- edges) yield (e._1, e._2, 1.0)
// e is interpreted as "any"
// therefore e._1 and e._2 are invalid / do not compile
更新
添加类型参数似乎有所帮助..但为什么需要呢?
val edgesw = for (e: (Int, Int) <- edges) yield (e._1, e._2, 1.0)
另一次更新我忽略了Seq / Array表示法!
val edges = Seq((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10),
(1,7),(4,10))
现在行为符合预期:
val edgesw = for (e <- edges) yield (e._1, e._2, 1.0)
edgesw: Seq[(Int, Int, Double)] = List((1,2,1.0), (2,3,1.0), (3,4,1.0), (4,5,1.0), (1,6,1.0), (3,8,1.0), (4,9,1.0), (5,10,1.0), (1,7,1.0), (4,10,1.0))
答案 0 :(得分:1)
以下内容:
val edges = ((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10), (1,7),(4,10))
val edgesw = for (e <- edges) yield (e._1, e._2, 1.0)
无法编译。你提到的那样需要Seq
所以:
scala> val edges = Seq((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10))
edges: Seq[(Int, Int)] = List((1,2), (2,3), (3,4), (4,5), (1,6), (3,8), (4,9), (5,10))
scala> for (e <- edges) yield (e._1, e._2, 1.0)
res2: Seq[(Int, Int, Double)] = List((1,2,1.0), (2,3,1.0), (3,4,1.0), (4,5,1.0), (1,6,1.0), (3,8,1.0), (4,9,1.0), (5,10,1.0))
因此类型推断按预期工作。
答案 1 :(得分:0)
你应该使用这样的东西:
val edgesw = for (
eany <- edges.productIterator;
e = eany.asInstanceOf[(Int, Int)]
) yield (e._1, e._2, 1.0)
每个元组都延伸Product
特征,因此具有:
def productIterator: Iterator[Any]
但是因为每个元组成员都可以包含不同类型的对象Product
只能返回Iterator[Any]
。由于此eany
类型为Any
,因此您应将其转换为(Int, Int)
。
<强>更新强> 你的UPDATE版本对我不起作用:
val edgesw = for (e: (Int, Int) <- edges) yield (e._1, e._2, 1.0)
我收到以下错误:
值过滤器不是((Int,Int),...)...
的成员