为什么scala编译器不会推断出证据参数类型?

时间:2016-10-15 00:09:45

标签: scala

类型约束实现为以下类型:

  abstract class <:<[-From, +To] extends Function1[From, To]
  object <:< {
    implicit def conforms[A] = new (A <:< A) { def apply(x: A) = x }
  }

我们在代码中使用这样的证据:

def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) =
(it.head, it.last)

当我清除apply方法时,编译器说it不包含headlast,而隐式类型解析已经成功。这意味着C是Iterable [A]的子类型。但编译器无法推断出这一点。这只是Scala的类型推断不够强大吗?

1 个答案:

答案 0 :(得分:0)

我不明白......你觉得这个错了什么。它工作正常,

scala> :pa
// Entering paste mode (ctrl-D to finish)

def firstLast[A, C](it: C)(implicit ev: C <:< Iterable[A]) = (it.head, it.last)

// Exiting paste mode, now interpreting.

firstLast: [A, C](it: C)(implicit ev: <:<[C,Iterable[A]])(A, A)

scala> firstLast(List(1,2,3))
res0: (Int, Int) = (1,3)