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

时间:2017-07-28 18:10:35

标签: scala functional-programming monads scala-cats

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

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

我在instances包的来源看到了一些像Option这样的例子,但似乎有很多事要做,我不知道是否有一个简单的方法。

问候。

1 个答案:

答案 0 :(得分:1)

只需为您的类型提供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]