Монадическое сокращение в государственной монаде

Я застрял, пытаясь уменьшить список внутри монады состояния с помощью функции, возвращающей 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 => ???
}

К сожалению, в обоих случаях параметры типа необходимы (вывод типов здесь не сработает), поэтому вы, вероятно, захотите определить псевдоним типа и избегать лямбда-типов, если вы выполняете большую часть такого рода вещей.

Другие вопросы по тегам