如何为Monad状态堆栈,Disjunction和List定义函数?

时间:2017-03-19 17:58:32

标签: scala scalaz monad-transformers

我有一个列表monad constructor(private sanitizer:DomSanitizer){} var circle_elt = this.sanitizer.bypassSecurityTrustHtml( parser.parseFromString(svg_string, "image/svg+xml").childNodes[0] ); 。我想根据列表的值生成效果(Disjunction和state)。这是我的monad堆栈和运行monad堆栈的代码。我的问题是什么应该正确定义checkNum以便我可以生成正确的效果?

我的预期输出应该是 List[Int]

List(("", \/-(1), ("Error: 2", -\/(Throwable())), ("",\/-(3)), ("Error: 4", -\/(Throwable())))

1 个答案:

答案 0 :(得分:0)

我认为checkNum应该返回State[String, \/[Throwable,Int]]

def checkNum0(x: Int): State[String, \/[Throwable,Int]] = if ((x%2)==0) {
  constantState(-\/(new Throwable()), s"Error: $x")
} else {
  constantState(\/-(x), "")
}

def checkNum1(x: Int): StateTList[\/[Throwable,Int]] = checkNum0(x).lift[List]

然后你可以把你的理解写成:

val prg = for {
  x <- lst.liftM[StateTH].liftM[EitherTH]
  y <- EitherT(checkNum1(x))
} yield y

输出:

List(
  ("", \/-(1)),
  ("Error: 2", -\/(java.lang.Throwable)),
  ("", \/-(3)),
  ("Error: 4", -\/(java.lang.Throwable))
)