Кажется я наконец разобрался с вопросом почему программисты на haskell настойчиво подчеркивают тот факт что haskell так называемый pure ("чистый") язык. И причем здесь side effects.
Зачем вообще нужны эти "чистые" функции?
Для начала определения - функция будет называться "чистой" если на одни и те же входящие данные она всегда возвращает один и тот же результат.
Пример -
int f(int x) { return 3+x;} - чистая функция
int g(int x) { return random()+x;} - не чистая функция
Как видно в С/С++ чистые функции тоже возможны. Более того, если мы пробежимся по любому коду на С/С++ то мы увидем что большенство функций по крайней мере выглядят как "чистые". Да и большенство алгоритмов записанных на С/С++ неявно предполагает что на одни и те же входные данные мы будем получать один и тот же результат. Иначе программировать было бы сложновато...
Разница между С/С++ и Haskell состоит в том что в Haskell нет (пока забудем о монадах) возможности записать не "чистую" фукнцию.
На первый взгляд это только минус языку(на самом деле так оно и есть, просто плюсы перекрывают этот минус). Поскольку С/С++ получается, по крайней мере внешне, мощнее.
Ну а на второй...В С\С++ нет возможности явно указать является ли функция "чистой" или нет. И все функции по умолчанию считаются не "чистыми".
Допустим есть язык в котором такая возможность есть (Haskell). Что это дает собственно языку? Да толком то ничего... Так зачем же...
Тут возникает вопрос - а что это дает компилятору? А вот компилятору это дает многое. В частности это дает возможность компилятору оптимизировать написанный алгоритм. С использованием "ленивости", отложенных вычислений и прочих плюшек. В идеале получив на вход базовый алгоритм состоящий из вызовов "чистых" функций компилятор(путем оптимизации) может составить некий "идеально быстрый" алгоритм. Т.е. компилятор языка воспринимает подаваемую ему на вход программу как некую функцию над которой он может производить оптимизирующие действия. Банальный пример - получив на вход функцию
(функция получающая два указателя на функции и число и возвращающая число, пишу в псевдокоде)
int f( g(x),k(x),x)
{
return g(x)*g(x)+2*g(x)*k(x)+k(x)*k(x);
}
компилятор может не особо долго думая преобразовать ее в нечто вроде
int f( g(x),k(x),x)
{
int temp = g(x)+k(x);
return temp*temp;
}
Возможна ли такая оптимизация компилятором в С/С++? Нет, компилятор С/С++ не может быть уверен что вызовы g(x) всегда возвращают одни и те же значения.
Т.е. в языке в котором можно явно указать что функция является "чистой" становится возможной оптимизация на уровне алгоритма.
Помимо этого есть еще масса полезных вещей связанных с тестированием, автоматической верификацией кода и прочими вкусными вещами современного программирования.
Комментариев нет:
Отправить комментарий