我一直试图使用返回的函数来减少状态单子中的列表State
:
def op(t1: T, t2: T): State[S, T]
val list: State[S, List[T]]
我想减少列表以获得State[S, T]
不可能像所写的那样安全地执行此操作(如果列表为空会发生什么?),但如果您有一个标识元素 for op
,您可以使用foldLeftM
from 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 类型。