Чем может быть полезен в проектировании язык, в котором нет абстракции состояния? Как я, к примеру, могу написать банковский счет? Банковский счет имеет состояние, не так ли?
Простенький пример из этой серии - предположим мы хотим написать функцию реагирующую на нажатие клавиш. Допустим по "+" увеличивающую счётчик, по нажатию "-" уменьшающую счётчик и по нажатию на любую другую клавишу возвращающую итоговое значение. Очевидно, что нам нужна вспомогательная функция input_key, которая бы возвращала нажатую клавишу, но чистота функции не позволяет нам её оформить как int input_key() (в синтаксисе C), ибо разные значения функция может возвращать только если у неё разные входные параметры.
Делаем такой трюк - вводим в программу параметр world, который под собой подразумевает "состояние внешнего мира" и в частности он в себе как то инкапсулирует последовательность нажатий на клавиатуру (как тут уже неважно), тогда функцию input_key можно сделать совершенно чистой сделав её в таком виде (здесь что то джаваскриптное):
Код:
var (key, new_world) = input_key( world );
т.е. функция принимает world, а возвращает ПАРУ из считанной клавиши и нового состояния "мира" в котором эта клавиша уже считана и на очереди лежит другая.
тогда наша функция-считыватель может выглядеть так:
Код:
function input_counter( world )
{
return input_count_implement( world, 0 );
};
function input_count_implement( world, counter )
{
var (key, new_world ) = input_key( world );
switch ( key )
{
case "+": return input_count_implement( new_world, counter+1 );
break;
case "-": return input_count_implement( new_world, counter-1 );
break;
else: return { counter, new_world };
};
};
Т.е. что происходит - input_counter тоже по соглашению такого рода принимает в себя world и возвращает пару из результата и нового world.
Таким образом в программе таким образом написанной этот самый world надо "протаскивать" с самого верха до самого низа, который требует некоторого "стейта", при этом "нечистота" надёжно упрятана за фасадой вот этого world, который в принципе может быть реально просто списком заранее подготовленным, а может внутри быть реализован как считыватель из консоли - программе это уже становится неважно.
Такие дела.