如何调用取决于Kotlin / Arrow中多个Typeclass的多态函数

问题描述 投票:0回答:1

我创建了一个需要在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变形金刚“到达世界尽头”(即main()中)到达Monad的这个星座。类似于ReaderT<ForIO, Dependency, Unit>

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

monad-transformers arrow-kt
1个回答
0
投票

这是您要使用的代码段:

fun <M> M.logic(): Kind<M, String>
  where M: MonadReader<M, String>,
        M: Async<M> =
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())

目前无法执行,因为ReaderT在库中没有定义async的实例。如果您发送了PR,则可以。

请注意,您要追随Async,而不是Effect

© www.soinside.com 2019 - 2024. All rights reserved.