【发布时间】:2017-03-19 17:58:31
【问题描述】:
我有一个列表单子List[Int]。我想根据列表的值生成效果(析取和状态)。这是我的 monad 堆栈和运行 monad 堆栈的代码。我的问题是什么应该是正确的方法来定义 checkNum 以便我可以产生正确的效果?
我的预期输出应该是List(("", \/-(1), ("Error: 2", -\/(Throwable())), ("",\/-(3)), ("Error: 4", -\/(Throwable())))
import scalaz._
import Scalaz._
type EitherTH[F[_], A] = EitherT[F, Throwable,A]
type StateTH[F[_], A] = StateT[F, String, A]
type StateTList[A] = StateTH[List, A]
type EitherTStateTList[A] = EitherTH[StateTList, A]
val lst = List(1,2,3,4)
def checkNum(x:Int)(implicit ms:MonadState[EitherTStateTList, Int]) = if ((x%2)==0) {
put(s"Error: $x")
-\/(new Throwable())
} else {
put("")
\/-(x)
}
val prg = for {
x <- lst.liftM[StateTH].liftM[EitherTH]
// y <- checkNum(x).liftM[EitherTH]
} yield y
prg.run("")
【问题讨论】:
-
在 scala 中使用 > 2 个 monad 很麻烦,试试 eff 或 emm。
标签: scala scalaz monad-transformers