为所有适用类型传递函数

Wil*_*ger 6 scala

我按照这里的建议来定义一个名为square的函数,然后尝试将它传递给一个名为square的函数.函数定义如下:

 def square[T](n: T)(implicit numeric: Numeric[T]): T = numeric.times(n, n)
 def twice[T](f: (T) => T, a: T): T = f(f(a)) 
Run Code Online (Sandbox Code Playgroud)

当调用两次(square,2)时,REPL会发出错误消息:

scala> twice(square, 2)
<console>:8: error: could not find implicit value for parameter numeric: Numeric[T]
       twice(square, 2)
         ^
Run Code Online (Sandbox Code Playgroud)

任何人?

Dan*_*ral 21

除了Andrew Phillips,我不同意这里的所有人.好吧,到目前为止每个人.:-)问题出在这里:

def twice[T](f: (T) => T, a: T): T = f(f(a))
Run Code Online (Sandbox Code Playgroud)

你希望,像Scala的新手经常做的那样,Scala的编译器会考虑这两个参数twice来推断出正确的类型.但是,Scala并没有这样做 - 它只使用从一个参数列表到下一个参数列表的信息,而不是从一个参数到下一个参数.这意味着参数fa独立分析,而不具有知道对方是什么的优点.

这意味着,例如,有效:

twice(square[Int], 2)
Run Code Online (Sandbox Code Playgroud)

现在,如果将其分解为两个参数列表,那么它也可以工作:

def twice[T](a: T)(f: (T) => T): T = f(f(a))
twice(2)(square)
Run Code Online (Sandbox Code Playgroud)

因此,基本上,您尝试做的所有事情都是正确的并且应该有效,除了您期望一个参数帮助确定其他参数类型的部分(如您所写).