0

我已经创建了一个函数,它在它需要使用的 Monad 中是多态的,而不是依赖于这个 Monad 存在的类型类实例。它看起来像这样:

fun <M> M.logic(...): Kind<M, String>
      where M: MonadReader<M, Dependency>,
            M: Effect<M> =
   fx.monad() {
      val dependency = ask().bind()
      val response = effect { ...using dependency here... }.bind()
      response
   }

我正在使用MonadReader来获得依赖关系,并且我正在使用Effect,嗯,效果。现在我假设,我所需要的只是使用一些 Monad Transformers 来“在世界尽头”(即在main())到达这个 Monad 星座。类似的东西ReaderT<ForIO, Dependency, Unit>

但是,我似乎无法创建合适的M(或任何上下文)来调用此方法。如何在具有必要类型类实例的确切 monad 上调用此方法?

4

1 回答 1

1

这是您所追求的代码片段:

fun <M, F> M.logic(): Kind<F, String>
  where M: MonadReader<F, String>,
        M: Async<F> =
  fx.monad {
    val dependency = ask().bind()
    val response = effect { dependency }.bind()
    response
  }

object Transformer: 
  Async<KleisliPartialOf<ForIO, String>> by ReaderT.async(IO.effect()),
  KleisliMonadReader<ForIO, String> by ReaderT.monadReader(IO.monad())

请注意,这Async是您所追求的,而不是名称不佳的Effect. 你需要两个泛型,一个用于组合,另一个用于内容。

Transformer.run {
  logic()
}

Reader 的异步实例于 2020 年 1 月添加,并将在下一个版本 0.10.5 或 0.11.0 中提供:https ://github.com/arrow-kt/arrow/commit/6aaae6998de612eb0eec948697f1c477649230be

于 2020-02-07T18:33:01.407 回答