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