2

我一直试图使用返回的函数来减少状态单子中的列表State

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

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

4

1 回答 1

4

不可能像所写的那样安全地执行此操作(如果列表为空会发生什么?),但如果您有一个标识元素 for op,您可以使用foldLeftMfrom 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 类型。

于 2015-12-19T22:34:23.653 回答