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.

推导 类型 类