Scala中的Monad变压器
我一直在尝试简单的单子变形器,在那里我可以理解Scala中的Monad变压器,scala,monads,scalaz,monad-transformers,Scala,Monads,Scalaz,Monad Transformers,我一直在尝试简单的单子变形器,在那里我可以理解M[F[A]其中M和F是单子。如果S是不同的单子,我如何使M[F[A]]和M[S[A]]在for comp中协同工作 例如: val a: Future[List[Int]] = ... val b: Future[Option[Int]] = ... a需要一个ListT[Future,Int]和b需要一个option[Future,Int]但这些都不构成,我需要使用另一个变压器吗?这取决于我在for comp中使用它们的顺序吗 Monad转换器
M[F[A]
其中M
和F
是单子。如果S
是不同的单子,我如何使M[F[A]]
和M[S[A]]
在for comp中协同工作
例如:
val a: Future[List[Int]] = ...
val b: Future[Option[Int]] = ...
a
需要一个ListT[Future,Int]
和b
需要一个option[Future,Int]
但这些都不构成,我需要使用另一个变压器吗?这取决于我在for comp中使用它们的顺序吗 Monad转换器帮助您组合两个类型为F[G[X]]
的值
换句话说,monad转换器与F[G[X]
一起工作,因为如果存在monad[G]
的话,它们利用了您知道如何组合两个G[X]
的事实
现在,在F[G[X]
和F[H[X]]
的情况下,即使您声明G
和H
有Monad
实例,您仍然没有一个通用的方法来组合它们
我担心编写
F[G[X]]
和F[H[X]
对于monad transformer没有通用的解决方案。您可以尝试使用monad transformer堆栈ListT[OptionT[Future,Int]]
一次组合所有效果。您可以将a
和b
提升到该monad transformer堆栈的值中