Scala error: missing parameter type for expanded function
Scala error: missing parameter type for expanded function
我正在尝试为 Scala 编写一个查询库。这是到目前为止的代码:
class Query[TElement](source: Traversable[TElement]) {
def join[TOther](other: Traversable[TOther]) = new {
def on[TKey](keySelector1: TElement => TKey) = new {
def equals(keySelector2: TOther => TKey) = new {
def into[TResult](resultSelector: (TElement, TOther) => TResult): Query[TResult] = {
val map = source.map(e => (keySelector1(e), e)).toMap
val results = other
.map(e => (keySelector2(e), e))
.filter(p => map.contains(p._1))
.map(p => (map(p._1), p._2))
.map(p => resultSelector(p._1, p._2))
new Query[TResult](results)
}
}
}
}
}
object Query {
def from[TElement](source: Traversable[TElement]): Query[TElement] = {
new Query[TElement](source)
}
}
...
val results = Query.from(users)
.join(accounts).on(_.userId).equals(_.ownerUserId).into((_, _))
编译时出现以下错误:
error: missing parameter type for expanded function ((x) => x.ownerUserId)
我有点困惑为什么我会在非泛型函数上得到这个错误equals
。我认为它的通用参数来自外部范围。我知道要修复它,我必须通过编写 (a: Account) => a.ownerUserId
来明确说明参数类型是什么。然而,我试图让它成为一个非常流畅的库,这让它变得混乱。
问题很简单。从 Any
继承的现有方法 equals
存在歧义。简单示例:
scala> class X[A, B] { def equals(f: A => B) = f }
defined class X
scala> val x = new X[Int, String]
x: X[Int,String] = X@52d455b8
scala> x.equals((x: Int) => x.toString)
res0: Int => String = <function1>
scala> x.equals((x: String) => x.toString) // uh-oh
res1: Boolean = false
正如在最后一个例子中看到的,当传递了错误的函数类型时,编译器不得不选择def equals(Any): Boolean
。当您不指定任何类型时,编译器必须推断出一个类型,这在示例中是无法做到的。
只需将您的方法重命名为其他名称,问题就消失了。
我正在尝试为 Scala 编写一个查询库。这是到目前为止的代码:
class Query[TElement](source: Traversable[TElement]) {
def join[TOther](other: Traversable[TOther]) = new {
def on[TKey](keySelector1: TElement => TKey) = new {
def equals(keySelector2: TOther => TKey) = new {
def into[TResult](resultSelector: (TElement, TOther) => TResult): Query[TResult] = {
val map = source.map(e => (keySelector1(e), e)).toMap
val results = other
.map(e => (keySelector2(e), e))
.filter(p => map.contains(p._1))
.map(p => (map(p._1), p._2))
.map(p => resultSelector(p._1, p._2))
new Query[TResult](results)
}
}
}
}
}
object Query {
def from[TElement](source: Traversable[TElement]): Query[TElement] = {
new Query[TElement](source)
}
}
...
val results = Query.from(users)
.join(accounts).on(_.userId).equals(_.ownerUserId).into((_, _))
编译时出现以下错误:
error: missing parameter type for expanded function ((x) => x.ownerUserId)
我有点困惑为什么我会在非泛型函数上得到这个错误equals
。我认为它的通用参数来自外部范围。我知道要修复它,我必须通过编写 (a: Account) => a.ownerUserId
来明确说明参数类型是什么。然而,我试图让它成为一个非常流畅的库,这让它变得混乱。
问题很简单。从 Any
继承的现有方法 equals
存在歧义。简单示例:
scala> class X[A, B] { def equals(f: A => B) = f }
defined class X
scala> val x = new X[Int, String]
x: X[Int,String] = X@52d455b8
scala> x.equals((x: Int) => x.toString)
res0: Int => String = <function1>
scala> x.equals((x: String) => x.toString) // uh-oh
res1: Boolean = false
正如在最后一个例子中看到的,当传递了错误的函数类型时,编译器不得不选择def equals(Any): Boolean
。当您不指定任何类型时,编译器必须推断出一个类型,这在示例中是无法做到的。
只需将您的方法重命名为其他名称,问题就消失了。