我创建了一个需要在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上调用此方法?
这是您要使用的代码段:
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
。