Монадическое сокращение в государственной монаде
Я застрял, пытаясь уменьшить список внутри монады состояния с помощью функции, возвращающей State
:
def op(t1: T, t2: T): State[S, T]
val list: State[S, List[T]]
Я хотел бы сократить список, чтобы получить State[S, T]
1 ответ
Решение
Невозможно безопасно выполнить эту операцию, как написано (что произойдет, если список пуст?), Но если у вас есть элемент идентификации для 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 => ???
}
К сожалению, в обоих случаях параметры типа необходимы (вывод типов здесь не сработает), поэтому вы, вероятно, захотите определить псевдоним типа и избегать лямбда-типов, если вы выполняете большую часть такого рода вещей.