Some 和 None 等人的 Cats 实例
Cats instances for Some and None et al
在 Scala 2.13 和 Cats 中,以下工作正常:
import cats.implicits._
Traverse[Option]
然而以下失败:
import cats.implicits._
Traverse[Some]
我希望后者能够工作,不仅适用于 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
是一个函子并且 G[T] <: F[T]
对于所有 T
那么 G
不一定是一个函子。
此外,有时您可以使用 kittens.
推导 类型 类
在 Scala 2.13 和 Cats 中,以下工作正常:
import cats.implicits._
Traverse[Option]
然而以下失败:
import cats.implicits._
Traverse[Some]
我希望后者能够工作,不仅适用于 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
是一个函子并且 G[T] <: F[T]
对于所有 T
那么 G
不一定是一个函子。
此外,有时您可以使用 kittens.
推导 类型 类