【问题标题】:How to create an instance of typeclass Monad[F[_]] of a custom type constructor in Scala Cats如何在 Scala Cats 中创建自定义类型构造函数的类型类 Monad[F[_]] 的实例
【发布时间】:2018-01-04 21:35:50
【问题描述】:

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

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

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

问候。

【问题讨论】:

    标签: scala functional-programming monads scala-cats


    【解决方案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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多