Как вызвать функцию polymorphi c, которая зависит от нескольких классов типов в Kotlin / Arrow - PullRequest
0 голосов
/ 07 февраля 2020

Я создал функцию, которая полиморфна c в Монаде, которую он должен использовать, вместо этого она зависит от экземпляров классов типов, существующих для этой Монады. Это выглядит так:

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, ну, для эффектов. Теперь я предположил, что все, что мне нужно, это использовать несколько Трансформаторов Монад, чтобы добраться до этого созвездия Монады "в конце света" (то есть в main()). Что-то вроде ReaderT<ForIO, Dependency, Unit>.

Однако я не могу создать подходящий M (или любой контекст) для вызова этого метода. Как я могу вызвать этот метод для точной монады, которая имеет необходимые экземпляры классов типов?

1 Ответ

1 голос
/ 07 февраля 2020

Это фрагмент кода, который вы ищете:

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()
}

Экземпляр Asyn c для Reader был добавлен в январе 2020 года и будет доступен в следующем выпуске, либо 0,10. .5 или 0.11.0: https://github.com/arrow-kt/arrow/commit/6aaae6998de612eb0eec948697f1c477649230be

...