Declarative Programming

Alexey Raspopov, DataRobot.

Кто я?

Declarative Programming &
First-class Structures

Привет, Одесса!

О чем это я?

Disclaimer

Не буду рассказывать о React.

Извините :(

Будет страшный код.

Imperative Programming

Вы уверены что ваше представление о процессе совпадает с представлением других разработчиков в команде?

Imperative Programming

λ

Declarative Programming

Declarative Programming

Денотационная семантика

Денотационная семантика

Циклы? А нужно ли?

Glynn Winskel: Lecture Notes on Denotational Semantics

Рекурсия!

Why?
For the Glory
of Satan, of course!

First-class citizens

Сущность, которая может быть передана как параметр, возвращена как результат функции или присвоена переменной.

Это то, что вы можете представить в материальном виде, атомарно, а не как последовательность действий.

Присвоение переменной

			var result = function() {
			  return 13;
			};
		

Передача как параметра

			[1, 2, 3].map(function(number) {
			  return number * 2;
			});
		

Функция как результат

			function counter(start) {
			  return function() {
			    return start++;
			  };
			}
		

1 + (2 + (3 + x))

state

action state

newState(action, state)

(action state)

action ⇒ (action state)

...

ƒ(action, state) = state

Actions.reduce(...);

Всё вместе

				render = (Data) => UI;
				update = (State, Action) => NewState;
			
				Actions = [Update This, Add That, Delete Shit, ...];
				AppState = Actions.reduce(update, InitialState);
				AppState.subscribe(render);
			

Монады

Монады

Монады и Композиция

Композиция++

Монады

Railway Oriented Programming

fetch vs XMLHttpRequest

Promise

Асинхронная работа как first-class citizen

			var users = fetch("/users");
			var updatedUsers = users.then(fn);
		

Observable

			var clicks = Observable.fromEvent(element, "click");
			var coords = clicks.map(event => event.pageX);
			coords.forEach(x => console.log(x));
		

Dgelong

npm i dgelong

Dgelong

  1. Потому что я не хочу подключать комбайн с вайфаем если мне нужно написать всего одну строчку кода

Пример

			function validateInput(username) {
			  if (username !== "boring_wozniak") {
			    return Success(username);
			  }
			  return Failure("Steve Wozniak isn't boring");
			}
		

Неуспех как first-class citizen

Реальный пример

			return Maybe(prediction)
			  .bind(predictionValue)
			  .bind(fixedResult)
			  .bind(formattedResult)
			  .lift(PredictionResult, Spinner);
		

Никакой вложенной композиции, полная независимость функций.

Криминальное Чтиво

Спасибо!

Ссылка на слайды — alexeyraspopov.github.io/talks/first-class-programming