在 Scala 2.13 和 Cats 中,以下工作正常:
import cats.implicits._
Traverse[Option]
但是,以下操作将失败:
import cats.implicits._
Traverse[Some]
我希望后者不仅适用于 Traverse of Option 子类,也适用于任何具有存在给定类型类的父级的类型。
我尝试使用隐式证明 <:<创建一个方法,但无法完全使其工作。>
如果你真的明白你做什么,你可以手动定义必要的实例(如果存在(。
Some
与Id
同构。
implicit val someTraverse: Traverse[Some] = new Traverse[Some] {
override def traverse[G[_]: Applicative, A, B](fa: Some[A])(f: A => G[B]): G[Some[B]] = f(fa.value).map(Some(_))
override def foldLeft[A, B](fa: Some[A], b: B)(f: (B, A) => B): B = f(b, fa.value)
override def foldRight[A, B](fa: Some[A], lb: Eval[B])(f: (A, Eval[B]) => Eval[B]): Eval[B] = f(fa.value, lb)
}
一般来说,这是不可能的。如果F
是所有T
的函子和G[T] <: F[T]
,那么G
不一定是函子。
使用子类(cats/scalaz(使用函子调用泛型函数
此外,有时您可以使用小猫派生类型类。
为什么可以找到树的"Functor"实例,而找不到分支或叶子的"Functor"实例?