1
私はリストモナドList[Int]
を持っています。私は、リストの値に基づいてエフェクト(Disjunctionとstate)を生成したい。ここに私のモナドスタックと、モナドスタックを実行するコードがあります。私の質問は、私が正しい効果を生成できるようにcheckNumを定義する適切な方法でなければならないものです。どのようにしてMonad Stack of State、Disjunction、およびListの関数を定義できますか?
私の予想される出力は、私の意見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("")
> 2つのモナドでの作業は、EFFまたはEMMを試し、Scalaで扱いにくいです。 – Reactormonk