Преобразователи монад в Scala

Я пробовал простые трансформеры монад, где у меня есть понимание, включающее M[F[A]], где M и F - монады. Как я могу заставить M[F[A]] и M[S[A]] работать вместе в for comp, если S это другая монада?

Например:

val a: Future[List[Int]] = ...
val b: Future[Option[Int]] = ...

a требует ListT[Future, Int], а b требует OptionT[Future, Int], но они не составляют, мне нужно использовать другой преобразователь? Будет ли это зависеть от того, в каком порядке я их использую в for comp?


person Matthew Pickering    schedule 09.11.2016    source источник


Ответы (2)


Преобразователи монад помогают составить два значения типа F[G[X]].

Другими словами, преобразователи монад работают с F[G[X]], потому что они используют тот факт, что вы знаете, как составить два G[X], если Monad[G] существует.

Теперь, в случае F[G[X] и F[H[X]], даже если вы заявите, что G и H имеют Monad экземпляров, у вас все еще нет общего способа их составления.

Боюсь, составление F[G[X]] и F[H[X]] не имеет общего решения с монадными трансформерами.

person Gabriele Petronella    schedule 09.11.2016

Вы можете попробовать использовать стек преобразователя монад ListT[OptionT[Future, Int]], который объединяет все эффекты одновременно. Вы можете поднять a и b в значения этого стека преобразования монад.

person winitzki    schedule 05.03.2019