状态 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 类型.
我一直在尝试使用返回 State
:
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 类型.