T, n: Int) = data.reduce(f) def-6ren">
gpt4 book ai didi

scala - 重载函数导致 "missing parameter type for expanded function"错误

转载 作者:行者123 更新时间:2023-12-02 07:37:56 25 4
gpt4 key购买 nike

我有以下内容:

class FooList[T] (data: List[T]) {
def foo (f: (T, T) => T, n: Int) = data.reduce(f)
def foo (f: (T, T) => T, s: String) = data.reduce(f)
}

class BarList[T] (data: List[T]) {
def bar(f: (T, T) => T, n: Int) = data.reduce(f)
}

BarList 工作正常,FooList 失败:

scala> new FooList(List(1, 2, 3)).foo(_+_, 3)
<console>:9: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
new FooList(List(1, 2, 3)).foo(_+_, 3)

scala> new FooList(List(1, 2, 3)).foo(_+_, "3")
<console>:9: error: missing parameter type for expanded function ((x$1, x$2) => x$1.$plus(x$2))
new FooList(List(1, 2, 3)).foo(_+_, "3")
^
scala> new BarList(List(1, 2, 3)).bar(_+_, 3)
res2: Int = 6

为什么 FooList.foo 不起作用?

有什么方法可以让两个 FooList 调用同时工作吗?

最佳答案

似乎类型推断只有在选择适当的重载方法后才能确定 _ + _ 的类型,因此它在静态分派(dispatch)之前明确要求它;但是有一个解决方法:

class FooList[T] (data: List[T]) {
def foo (n: Int)(f: (T, T) => T) = data.reduce(f)
def foo (s: String)(f: (T, T) => T) = data.reduce(f)
}

scala> new FooList(List(1, 2, 3)).foo(3)(_ + _)
res13: Int = 6

scala> new FooList(List(1, 2, 3)).foo("3")(_ + _)
res14: Int = 6

如果你不想改变客户端的API,你可以合并两个重载方法(第二个参数变成union type):

class FooList[T] (data: List[T]) {
def foo[A] (f: (T, T) => T, NorS: A)(implicit ev: (Int with String) <:< A) = NorS match {
case n: Int => data.reduce(f)
case s: String => data.reduce(f)
}
}

scala> new FooList(List(1, 2, 3)).foo(_ + _, "3")
res21: Int = 6

scala> new FooList(List(1, 2, 3)).foo(_ + _, 3)
res22: Int = 6

scala> new FooList(List(1, 2, 3)).foo(_ + _, 3.0)
<console>:15: error: Cannot prove that Int with String <:< Double.
new FooList(List(1, 2, 3)).foo(_ + _, 3.0)
^

因此,调度在这里转移到运行时,但实际接口(interface)保持不变。

关于scala - 重载函数导致 "missing parameter type for expanded function"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29524618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com