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

时间:2017-02-18 17:37:43

标签: scala traits implicit scala-cats

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

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

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

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

val o: Option[Int] = wrapA[Int, Option](1)
val o: Option[Int] = wrapA(1)(catsStdInstancesForOption)

这不是类型检查:

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

好的,在TryInstances

之前解析了OptionInstances
trait AllInstances
  ...
  with    OptionInstances
  ...
  with    TryInstances
  with    TupleInstances
  ...

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

Cats 0.9.0,Scala 2.12.1

谢谢。

编辑毕竟Applicative似乎没有Tuple2个实例,因此没有pure,所以这部分问题似乎已经解决了。

0 个答案:

没有答案