我遵循了发现的建议here定义一个名为 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))
当调用两次(square, 2)时,REPL会输出一条错误消息:
scala> twice(square, 2)
<console>:8: error: could not find implicit value for parameter numeric: Numeric[T]
twice(square, 2)
^
Anyone?
我不同意这里所有人的观点,除了安德鲁·菲利普斯。嗯,到目前为止大家都这样。 :-) 问题就在这里:
def twice[T](f: (T) => T, a: T): T = f(f(a))
您期望 Scala 的编译器能够考虑到,就像 Scala 新手经常做的那样both参数为twice
推断正确的类型。但 Scala 并没有这样做——它只使用从一个参数列表到下一个参数列表的信息,而不是从一个参数到下一个参数的信息。这意味着参数f
and a
独立分析,不具有了解对方是什么的优势。
这意味着,例如,this works:
twice(square[Int], 2)
现在,如果您将其分解为两个参数列表,那么它也可以工作:
def twice[T](a: T)(f: (T) => T): T = f(f(a))
twice(2)(square)
所以,基本上,你尝试做的一切都是正确的并且应该有效,except对于您期望一个参数帮助确定另一个参数的类型的部分(如您所写)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)