为什么在cat中尝试默认的隐式Applicative实例

kos*_*tja 5 scala implicit traits scala-cats

和猫一起玩,我注意到了一些我无法解释的行为:

import cats.implicits._
...
def wrapA[A, F[_]](v: A)(implicit F: Applicative[F]): F[A] = F.pure(v)
Run Code Online (Sandbox Code Playgroud)

不是一个特别有用的方法,只是玩耍.

完全参数化方法或传递所需的实例显然工作正常:

val o: Option[Int] = wrapA[Int, Option](1)
val o: Option[Int] = wrapA(1)(catsStdInstancesForOption)
Run Code Online (Sandbox Code Playgroud)

这不是类型检查:

val o: Option[Int] = wrapA(1) // found scala.util.Try[Int], required Option[Int]
Run Code Online (Sandbox Code Playgroud)

好的,TryInstances在之前解决了OptionInstances

trait AllInstances
  ...
  with    OptionInstances
  ...
  with    TryInstances
  with    TupleInstances
  ...
Run Code Online (Sandbox Code Playgroud)

但那么为什么没有Tuple2预料到Try呢?在TupleInstances解决之前TryInstances并定义Applicative实例.是arity吗?实例的顺序是否有特殊原因?虽然我看到值类型不会影响隐式解析,但为什么不呢?

Cats 0.9.0,Scala 2.12.1

谢谢.

编辑似乎没有任何Applicative实例Tuple2,因此没有pure,所以这部分问题似乎已经解决了.