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.