2016-10-18 9 views
1

Я следую этому руководству, чтобы начать обучение функционального программирования ж/Javascript: https://medium.com/@cscalfani/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536#.iynj38h83Функционального программирования Чистота Требование к функциям хэширования

Он определяет Чистую функцию:

  • Работает только на входных параметрах
  • Полезные чистые функции принимают по крайней мере один параметр
  • Полезные Чистые функции должны возвращать что-то
  • Чистые функции не могут измениться внешние переменные/Отсутствие побочных эффектов
  • Чистые функции всегда будут производить тот же результат, не учитывая тот же вход

Следующая функция нарушает договор:

function notPure(data) { 
 
    let ts = new Date(); 
 
    return md5(data + ts); 
 
}

Но следующий было бы чисто:

function pureFunction(data, ts) { 
 
    return md5(data + ts); 
 
    }

Предполагая, что я правильно понимаю, в чем смысл? Я молод в этой части поля. Я еще не понимаю, как это полезно. Включает ли временная метка внутри функции функцию с сохранением состояния и нарушением чистоты?

В чем преимущество форсирования этих значений в другом месте и передается в чистую функцию в качестве параметра?

+0

hmm откуда вы пришли, что первая версия не чиста?выглядит чисто для меня :) – niceman

+0

@niceman его совсем не чисто, дает разные результаты на тех же входах –

+0

@JaredSmith ahhh Я вижу, 'new Date()' get is текущая дата, моя ошибка – niceman

ответ

3

Программы всегда будут иметь состояние. Всегда. Идея чистого функционального программирования состоит в том, что вы нажимаете состояние (насколько это возможно) на ребра ваших программ: например, сканирование в строке пользовательского ввода, выполнение кучи чистых функций на нем и выводка обратно на консоль.

Это имеет много преимуществ:

  • Чистые функции легко проверить
  • Государственные связанные ошибки имеют меньше места, чтобы скрыть
  • Чистые функции могут быть сделаны, чтобы генерировать очень производительную машину код.
  • Отсутствие недействительности кеша. Поскольку функции ссылочно прозрачны, вы можете memoize по своему усмотрению.
  • Это открывает двери для действительно классных вещей, таких как перезагрузка горячего кода. I не может сверхразмерный, насколько это удивительно.

Итак, для вашего примера функция, как бы вы протестировали нечистую версию? Чистая версия проста, вы передаете ей дату и утверждаете, что она возвращает ожидаемый результат.

+0

hmmm Я думаю, что OP хочет получить более конкретный ответ на свой пример (почему прохождение метки времени лучше, чем его создание) – niceman

+0

также не знаю, будут ли виртуальные машины javascript (будь то Google V8 или spidermonkey или ...) оптимизировать чистые функции путь Haskell делает – niceman

+0

Я вижу преимущество организации кода и отладки, но это не может быть единственной причиной для чистых функций, не так ли? – ArnonRednon