为什么scala.collection.immutable.List [Object]不是GenTraversableOnce [?]

时间:2018-09-10 08:30:34

标签: scala iterable arity traversable

一个简单的问题,如果这是一个愚蠢的问题,对不起,因为我才刚开始使用scala。我收到类型不匹配错误,提示:

found   : (AnyRef, org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable) => List[Object]
required: ((AnyRef, org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable)) => scala.collection.GenTraversableOnce[?]

但是根据此帖子(I have a Scala List, how can I get a TraversableOnce?),scala.collection.immutable.ListIterable,因此也是GenTraversableOnce。但是,此错误似乎表明并非如此。而且,当我实际查看该帖子的可接受答案中的链接时,我看不到对“可遍历”一词的任何引用。

如果问题与我的内部类不正确有关,那么我必须说此错误非常无用,因为要求内部类的类型为“?”显然是一种虚无的陈述。在理解这一点方面的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

Function2[X, Y, Z]Function1[(X, Y), Z]是不同的东西。

比较这两个定义:

val f: ((Int, Int)) => Int = xy => xy._1 + xy._2
val f: (Int, Int) => Int = (x, y) => x + y

第一个也可以用模式匹配来编写,它首先分解元组:

val f: ((Int, Int)) => Int = { case (x, y) => x + y }

这正是错误消息要求您执行的操作:提供一个以 tuple 作为参数的 unary 函数,而不是二进制函数。请注意,有一种tupled方法可以做到这一点。

函数的返回类型在这里基本上无关紧要,编译器无法统一它们,因为它在输入类型上失败。


也相关:

  1. 与eta扩展相同的故事:Why does my implementation of Haskell snd not compile in Scala