我按照这里的建议来定义一个名为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并没有这样做 - 它只使用从一个参数列表到下一个参数列表的信息,而不是从一个参数到下一个参数.这意味着参数f和a独立分析,而不具有知道对方是什么的优点.
这意味着,例如,这有效:
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)
因此,基本上,您尝试做的所有事情都是正确的并且应该有效,除了您期望一个参数帮助确定其他参数类型的部分(如您所写).