我试图了解如何使用Monad变形金刚。我阅读了有关它的Wiki文章,但仍有一些疑问。
我们的IOmonad需要读取用户的输入。但是并非总是提供输入。就是这样Option。为简化起见,我们可以定义一个OptionT“封装” IO单子动作的单子。
在我的特殊情况下,我有两个类型为Future[Option[String]]和的单子Future[List[Int]]。就是说,为简化起见,我需要两个不同的转换器,ListT[T]并且OptionT[T]对于每种monad类型,我都需要在其中嵌入Future行为...对吗?
正确,monad转换器的工作方式是帮助您处理由“外部” monad进行“转换”的“内部” monad。
因此,F[Option[A]可以变成一个OptionT[F, A](这里F是任何单子),它是与工作轻松多了。
关于ListT,可能并不容易。例如cats,没有提供一个,请参阅其常见问题解答以获取更多信息。正如他们建议的那样,您可以Nested替代不需要的情况flatMap,例如:
import cats._
import cats.implicits._
import cats.data.Nested
import scala.concurrent.Future
import scala.concurrent.Implicits.global
val futList = Future(List(1, 2, 3))
Nested(futList).map(_ + 1).value // Future(List(2, 3, 4))
Run Code Online (Sandbox Code Playgroud)
如果您想对monad变压器进行另一番尝试,这是我撰写的一篇简短文章:https : //blog.buildo.io/monad-transformers-for-the-working-programmer-aa7e981190e7