蒙纳德州Monadic减少

时间:2015-12-19 20:47:45

标签: scala scalaz scalaz7

我试图使用返回State的函数来减少状态monad中的列表:

def op(t1: T, t2: T): State[S, T] 
val list: State[S, List[T]]

我想减少列表以获得State[S, T]

1 个答案:

答案 0 :(得分:4)

无法安全地执行此操作(如果列表为空,会发生什么?),但如果您有op的标识元素,则可以使用foldLeftM Foldable }}:

list.flatMap(_.foldLeftM[({ type L[x] = State[S, x] })#L, T](opId)(op))

或者你可以这样写:

list.flatMap {
  case h :: t => t.foldLeftM[({ type L[x] = State[S, x] })#L, T](h)(op)
  case Nil => ???
}

不幸的是,在这两种情况下都需要类型参数(类型推断在这里不起作用),所以你可能想要定义一个类型别名并避免使用类型lambda,如果你做了很多这样的事情。 / p>