Scala 使用Monads转换器堆叠Monads

Scala 使用Monads转换器堆叠Monads,scala,scala-cats,Scala,Scala Cats,我正在学习单子变形金刚,我正在努力学习如何嵌套单子 假设我想创建一个未来[String,Option[a]]] 所以为了模拟这个形状我做了 type Error = String type FutureEither = EitherT[Future, Error, A] type FutureEitherOption = OptionT[FutureEither, A] 现在我知道了 val p1 = 1.pure[FutureEitherOption] 我得到 OptionT(Either

我正在学习单子变形金刚,我正在努力学习如何嵌套单子

假设我想创建一个
未来[String,Option[a]]]

所以为了模拟这个形状我做了

type Error = String
type FutureEither = EitherT[Future, Error, A]
type FutureEitherOption = OptionT[FutureEither, A]
现在我知道了

val p1 = 1.pure[FutureEitherOption]
我得到

OptionT(EitherT(Future(Success(Right(Some(1))))))
所以这看起来是正确的。我有一个1的选择权,这是一个权利,这是一个未来的成功。好!

但如果我这样做了

Option.empty[Int].pure[FutureEitherOption]
我希望我能获得
未来(成功(正确(无))
,但我看到了结果

OptionT(EitherT(Future(Success(Right(Some(None))))))
还有,如果我想要

Future(Success(Left("fail")))
如果我试着去做

val p2 = Left("fail").pure[FutureEitherOption]
输出很奇怪

OptionT(EitherT(Future(Success(Right(Some(Left(fail)))))))

这根本不是我的形状,因为现在有两个Either….

1
类型为
Int
,因此通过调用
.pure[FutureEitherOption]
可以得到正确的形状:

OptionT(EitherT(Success)(右)部分(1(())))
Option.empty[Int]
属于
Option[Int]
类型,因此您需要执行以下操作:

OptionT[futureither,Int](Option.empty[Int].pure[futureither])
为了获得正确的形状,请执行以下操作:

OptionT(EitherT(成功)(右(无)))
Left(“fail”)
的类型为
Left[String,Nothing]
(但实际上也是
的[Error,Option[Int]]
),因此您需要执行以下操作:

OptionT[futureather,Int](EitherT[Future,Error,Option[Int]](任.left[Error,Option[Int]](“fail”).pure[Future]))
为了获得正确的形状,请执行以下操作:

OptionT(EitherT(成功)(左(失败)))
然后你就可以完成所有这些了。例如,你可以写一篇理解文章,如下所示:

用于{
A.