Scala 趣题 6

这个必须是Scala的编译器需要改进的地方。人能立即推断出来的,编译器也应该能推断出来

package pz005

object Pz005 {
  def square[T: Numeric](n: T) = implicitly[Numeric[T]].times(n, n)
  def twiceA[T](f: T => T, a: T) = f(f(a))
 twiceA(square, 2) // 报错找不到隐式值
  def twiceB[T](f: T => T)(a: T) = f(f(a))
  twiceB(square)(2) // 错误同上
  def twiceC[T](a: T, f: T => T) = f(f(a))
  twiceC(2, square) //错误同上
  def twiceD[T](a: T)(f: T => T) = f(f(a))
  twiceD(2)(square)  // ok, 编译器探测到2就是要传递给square的T类型的参数
}

square需要一个Numeric[T]类型的隐含参数

判断当前上下文是否存在这样的隐含参数,必须先确定T的类型

只有第4种方法“足够提前”地把T的信息告诉了编译器

你可能感兴趣的:(scala)