如何在 Scala Cats 中创建自定义类型构造函数的类型类 Monad[F[_]] 的实例

How to create an instance of typeclass Monad[F[_]] of a custom type constructor in Scala Cats

如何在 Cats 中创建自定义类型构造函数的实例? 我知道 cats 已经附带了几乎所有 Scala 内置类型构造函数,我可以通过例如 import cats.data._ import cats.implicits._ import cats.instances._ 导入它们,但我想知道如何创建自己的隐式实例来使用 monads 运算符语法,如 >>= 使用我自己的自定义类型构造函数。假设我有 MyType[A] 是 monadic o 至少有 flatMap 和一个 pure 构造函数,我想做这样的事情:

Monad[MyType].pure(x) >>= { _.fooBar }

我在instances包的源码里看到了一些像Option这样的例子,但是好像有很多事情要做,我不知道有没有简单的方法。

问候。

只需为您的类型提供一个隐式的 Monad 实例,并实现所需的方法:

implicit object MyMonad extends Monad[MyType] {
  def pure[A](x: A): MyType[A] = ???
  def flatMap[A, B](fa: MyType[A])(f: A => MyType[B]): MyType[B] = ???
  def tailRecM[A, B](a: A)(f: A => MyType[Either[A, B]]): MyType[B] = ???
}

如果您确信您的 Monad 是堆栈安全的,您可以跳过实现 tailRecM 并改为扩展 StackSafeMonad[MyType]