我试图使用返回State
的函数来减少状态monad中的列表:
def op(t1: T, t2: T): State[S, T]
val list: State[S, List[T]]
我想减少列表以获得State[S, T]
答案 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>