Для понимания - это функциональный способ написания «императивного вида» кода.
Я приведу Пол Chiusano и Runar Бьярнасон из «функционального программирования в Scala», потому что я никогда не мог поставить его лучше:
Page 89
не являются императивными и функциональными противоположностями программирования?
Абсолютно нет. Помните, что функциональное программирование - это просто программирование без побочных эффектов. Императивное программирование - это программирование с заявлениями о том, что модифицирует какое-либо состояние программы, и, как мы видели, вполне разумно поддерживать состояние без побочных эффектов.
Функциональное программирование имеет отличную поддержку для написания императивных программ, с добавлением добавленной выгоды, которую такие программы могут быть обоснованы относительно экваториально, потому что они ссылочно прозрачны.
Пример из той же странице:
val ns: Rand[List[Int]] =
int.flatMap(x =>
int.flatMap(y =>
ints(x).map(xs =>
xs.map(_ % y))))
Пока не ясно, что здесь происходит. Но так как у нас есть map
и flatMap
определены, мы можем использовать для постижение восстановить императивный стиль:
val ns: Rand[List[Int]] = for {
x <- int
y <- int
xs <- ints(x)
} yield xs.map(_ % y)
Этот код намного легче читать (и писать), и это выглядит что это такое - императив , который поддерживает какое-то состояние. Но это тот же код. Мы получаем следующий Int
и назначить его x
, получить следующий Int
после этого и назначить его y
, затем сгенерировать список длины x
, и, наконец, вернуться в список со всеми его элементов по модулю y
. Чтобы облегчить такое императивное программирование с помощью понятий (или flatMaps
), нам понадобятся только два примитивных комбинатора состояний - один для чтения состояния и один для записи состояния.
Еще одна из страницы 203:
Мы можем видеть, что цепь flatMap
вызовов (или эквивалентной для-понимания), как императивные программы с операторами, которые присваивают переменные , и Монада указывает, что происходит на границах инструкций.
Я не думаю, что вопрос имеет смысл. 'for (...) yield {...}' является функциональным, так как он создает новое значение. 'for (...) {}' обязательно, так как это делает побочный эффект. Оба предназначены для понимания. –