状态 Monad 中的 Monadic Reduce

Monadic Reduce in the State Monad

我一直在尝试使用返回 State:

的函数来减少状态 monad 中的列表

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

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

不可能按照写的那样安全地执行此操作(如果列表为空会发生什么?),但如果您有 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 类型.