Обычная функция отображения имеет подпись A => B
, чтобы преобразовать F[A]
в F[B]
, например List[A]
в List[B]
.
Но что, если вы это сделаете если функция отображения должна нести некоторое состояние, вдоль которого требуется вычисление B
?
Скажем, функция отображения выглядит следующим образом: (A, S) => (B, S)
, где S - тип State
. Для каждого A
ранее возвращенный S
передается в функцию отображения, в то время как первоначально для состояния предоставляется элемент zero
. Затем функция отображения возвращает новое состояние (вместе с результатом), которое затем снова передается вместе со следующим значением и т. Д.
Конечно, .map
недостаточно мощно, чтобы сделать это, поэтому решение должно основываться на другом операторе.
Для наглядности приведу конкретный пример, скажем, у меня есть последовательность Ints
, и я хочу вычислить разницу каждого Int
с предыдущим Int
в этой последовательности. Реализация функции отображения, как описано выше, будет выглядеть следующим образом:
def mapping(currentElement: Int, previousElement: Option[Int]): (Option[Int], Option[Int]) = {
(previousElement.map(currentElement - _), Some(currentElement))
}
Начальное значение zero
для previousElement
будет None
, а после первого элемента оно всегда будет Some(currentElement)
. Результатом для каждой итерации будет Some
текущего значения за вычетом последнего значения, за исключением первого элемента, где он равен None
.
Как преобразовать, например, List(1, 4, 3)
в List(None, Some(3), Some(-1))
Использование функции mapping
?
(Обратите внимание, что пример Int-вычитания приведен исключительно для иллюстративных целей, а фокус вопроса - универсальное решение для описанного типа операции.)