Фон
Значение forExpression
(ниже) возвращает монаду StateT
, которая принимает в качестве параметра начальное состояние, добавляет к состоянию 2, а затем 3, а затем умножает это значение на 10.
Вопрос
Почему функции add(2)
и add(3)
выполняются при запуске этого экземпляра StateT
после того, как результат этих двух функций "отбрасывается" путем присвоения ему символа подчеркивания?
Пример
если вы оцениваете forExpression
с начальным состоянием IntState(1)
, почему возвращается IntState(60)
вместо IntState(10)
?
Ниже приведен минимальный фрагмент кода, или вы можете просмотреть полный исходный код на github.
Этот код был обнаружен при чтении книги Элвина Александера «Упрощенное функциональное программирование».
case class IntState(i: Int)
def add(i: Int) = StateT[IO, IntState, Int] { oldState =>
val newValue = i + oldState.i
val newState = oldState.copy(i = newValue)
IO((newState, newValue))
}
def multiply(i: Int) = StateT[IO, IntState, Int] { oldState =>
val newValue = i * oldState.i
val newState = oldState.copy(i = newValue)
IO((newState, newValue))
}
val forExpression: StateT[IO, IntState, Int] = for {
_ <- add(2)
_ <- add(3)
x <- multiply(10)
} yield x