Национальный день
Поздравляю: Меня и мою Родину, и конечно же моих друзей, с Национальным праздником! Национальный деньbuffблагословение,bugспасаться бегством.
Кстати, я не обновлял статью четыре месяца😂, есть объективные факторы, но я снова вернулся️.
зачем писать эту статью
Потому что я написал статью раньше:
Как писать высококачественные функции — открывая две вены Рена и Ду [Теория]
Сейчас, когда я перечитываю эту статью, я обнаруживаю, что некоторые моменты не являются углубленными, и нет ощущения проникновения в непосредственную суть. Поэтому я хочу повторно провести высокоуровневый обзор теоретической главы функционального программирования.
В этой статье я дам четкое изложение сути, цели, тонкостей функционального программирования в виде предыстории и вопросов, пожалуйста, прочтите ее вместе со мной.
Общее введение в статью
написание логики
Изучая историю развития компьютеров и языков программирования, найдите предысторию эпохи функционального программирования. Исследуйте и почувствуйте скрытую сущность функционального программирования, представляя людей, тесно связанных с функциональным программированием.
оригинальный
Эта статья была впервые опубликована вживые интернет-технологииВ публичном аккаунте WeChat:
Автор: Ян Кун. Конечно же это я 😂, версия Наггетс более смешная.
Ниже я привожу краткое содержание:
Введение
- История компьютеров и языков программирования
10 вопросов о функциональном программировании
- Почему существуют функциональные языки? Как появились функциональные языки? В чем смысл его существования?
-
lambdaЧто такое арифметическая система?lambdaО чем именно идет речь?lambdaКакое отношение он имеет к функциям? почему бы не бытьlambdaСистема исчисления? - Зачем использовать функции для реализации функционального программирования?
- Что означает слово «функция» в функциональных языках или в функциональном программировании? На что оно способно?
- Каковы характерные ключевые слова функционального программирования?
- Противоположны ли императивное и функциональное программирование?
- согласно с
FPПодумал, нельзя использовать цикл, как решить? - Генерация исключений может иметь побочные эффекты, но если вы этого не сделаете, то какая альтернатива?
- Запрещает ли функциональное программирование изменяемое состояние? Как выразить нашу программу без побочных эффектов?
- Почему функциональное программирование рекомендует исключать операторы?
JavaScript5 вопросов о функциональном программировании
- Почему следует избегать функционального программирования
this -
JavaScriptСредняя функция является гражданином первого класса, мы можем получитьJavaScriptЭто функциональный язык? зачем говоритьJSЭто полиморфный язык? - Зачем
JSможно использовать внутри функцииforцикл? -
JSФункции — граждане первого сорта, что такое сознание? Какова цель этого? - использовать
JSКаковы недостатки функционального программирования?
Суммировать
- Будущее функционального программирования.
Краткий каталог окончен, пожалуйста, прочтите его вместе со мной.
PS: Я кажусь ребенком, играющим у моря, радующимся время от времени тому, что нахожу более гладкий камень, чем обычно, или более красивую раковину, а то, что разворачивается передо мной, — это совершенно неизведанное море правды.
История компьютеров и языков программирования
В истории развития компьютеров и языков программирования доминировали люди, и важно понимать людей, сыгравших ключевую роль в этом процессе.
Давайте взглянем на несколько сверхгигантов, которые играют ключевую роль.
Дэвид Гилберт
нажмите
TPпредставлять:Дэвид Гилберт
ГильбертназываетсяНекоронованный король математики,онгений из гениев.
На мой взгляд, самая сильная мысль Гильберта заключается в следующем:
Он призвал всех сделать процесс доказательства чисто механическим, потому что таким образом машины могли бы обосновывать большое количество теорем с помощью формальных языков.
Также благодаря его настойчивости формальный язык постепенно переместился в центр исторической сцены.
Алан Мэтисон Тьюринг
нажмите
TPпредставлять:Алан Мэтисон Тьюринг
Алан Мэтисон Тьюрингназываетсяотец информатики.
На мой взгляд, его самым большим достижением было изобретение машины Тьюринга:
Как показано на рисунке выше, это схема модели машины Тьюринга.
Здесь мы обращаем внимание на одну вещь:
Из рисунка мы обнаружим, что каждый маленький квадрат может хранить число или букву. Эта информация очень важна, об этом может подумать каждый.
PS:жди моего знакомствафон Нейман, вы поймете связь между ними.
Церковь Алонзо
нажмите
TPпредставлять:Церковь Алонзо
Церковь Алонзо,Алан Мэтисон Тьюрингдокторская степень.
Его величайшие достижения:
Изобрел λ(лямбда) исчисление.
Как показано выше, этоλ(lambda) 演算основная форма.
Церковь Алонзоизобрел
λ演算Вместе с изобретенной Тьюрингом машиной Тьюринга мы переписали историю формальных языков в современном мире.
думать:церквиλ演算И машина Тьюринга, в чем разница и связь между ними?
фон Нейман
нажмите
TPпредставлять:фон Нейман
фон Нейманназываетсяотец компьютера.
он предложилфон НейманАрхитектура:
Из приведенного выше рисунка мы видим, что:
фон НейманАрхитектура состоит из пяти компонентов: оператор, контроллер, память, устройство ввода и устройство вывода. Использование двоичной логики, хранение программ и их выполнение — вот три принципа производства компьютеров.
Обратите внимание на сообщение:
Мы знаем, что низкоуровневые инструкции компьютера создаются0а также1состоит из0а также1изCRUD, для выполнения различных вычислительных операций. Когда мы снова посмотрим на машину Тьюринга, мы обнаружим, что каждый маленький квадратик может хранить число или букву.
Увидев это, вы обнаружили, что между архитектурой фон Неймана и машиной Тьюринга есть какая-то связь?
Да, текущая архитектура фон Неймана — это компьютерная структура, реализованная в соответствии с моделью машины Тьюринга. компьютер0а также1, является частным случаем чисел или букв в маленьких квадратах машин Тьюринга.
Зачем упоминать этих людей
Потому что, если вы хотите полностью разобраться в путанице функционального программирования, вы должны понимать предысторию этой эпохи и некоторые деяния ключевых людей.
Разговор о тезисе Черча-Тьюринга
Черч был научным руководителем Тьюринга, и между ними был знаменитый тезис.Тезис Черча-Тьюринга.
Общее содержание диссертации:
Существуют ли для двух моделей, Тьюринга и лямбда, расчет, который может быть представлен одной моделью и не может быть представлен другой моделью?
Пока ответа на эту тему нет. Из-за этого многие людиlambdaМодель полна уверенности. В последующие годы,lambdaМодели изучались, демонстрировались и практиковались многими людьми.
Рождение первого программируемого компьютера
это называетсяENAIC.
1946лет, первый в мире электронный компьютер --ENIACВыходит, он может изменить способ расчета, то есть может изменить программу.
То есть:
Это программируемый компьютер.
Почему программируемый
perlдизайнер языкаLarry Wallсказал:
У хороших программистов есть три достоинства:Ленивый, нетерпеливый, высокомерный.
Программируемость прекрасно воплощает достоинство лени. существует
ENAICПосле его рождения появились различные языки программирования. Три добродетели также ярко отражены.
Классификация компьютерных языков
Из приведенного выше рисунка можно получить следующую информацию:
- Языки программирования — это всего лишь одна из категорий компьютерных языков.
-
HTML,XMLэто язык проектирования данных. - В языках программирования он делится на декларативный и декларативный.
- В описательной формуле он также включает функциональную формулу, логическую формулу и т. д. Фактически,
MySQL. Это логический язык, который завершает операции, задавая вопросы. - Системы фон Неймана больше соответствуют языкам, ориентированным на процессы.
Вы можете внимательно посмотреть на эту категорию, и у вас возникнут некоторые чувства.
Простая история языка программирования
Вышеприведенная картина очень проста и понятна, только1995год.
График времени выглядит так:
xxx ---> xxx ---> .... ---> JavaScript ...
время пришло1996Год,JavaScriptРодился!
JavaScript родился!
Отец JavaScript — Брэндон Эдж
Парня на картинке зовутБрэндон Эдж. В том году ему было 34 года.
Взгляните на отрывок, написанный Жуань Ифэн.
От картинки выше у вас получатся следующие впечатления:
- Первое чувство: Абу прав
JavaНикакого интереса. - Второе чувство: поскольку он ненавидит Java, Абу не хочет использовать представление объектов Java, поэтому он заимствует язык Self и использует механизм наследования на основе прототипов. За последние несколько лет посеял семена объектно-ориентированного программирования с помощью прототипов в мире фронтенда.
- Третье чувство: Абу научился у
Schemeязык, возводя функции в статус первоклассных граждан, позволяяJSОбладать мощью функционального программирования. похороненныйJSСемя, которое может выполнять функциональное программирование. - Четвертое чувство:
JSЭто может быть как функциональное программирование, так и объектно-ориентированное программирование.
мои личные чувства
Ознакомившись с историей языков программирования и некоторыми историями, я не думаюJavaScriptЭто плохой язык, наоборот, именно эта середина заставляетJavaScriptможет быть популярен до сих пор.
Суммировать
Благодаря краткому введению в историю развития компьютерных языков и ключевых фигур мы можем оценить потенциал и влияние функционального программирования на историю развития компьютерных языков с высокого уровня.
Однако понимание функционального программирования ограничено введением фона и персонажей. Ниже я объясню тонкости функционального программирования, задавая вопросы.
10 вопросов о функциональном программировании
Далее пройдет10Ответ на этот вопрос состоит в том, чтобы объяснить теоретическую поддержку функционального программирования, предысторию рождения функционального программирования, основную теорию функционального программирования и ее производные.
Почему существуют функциональные языки? Как появились функциональные языки? В чем смысл его существования?
Существование функциональных языков заключается в реализации сущности вычислительных систем — операций.
Главное повторяется трижды: операция, операция, операция.
Исследование формализованной вычислительной системы
До появления компьютеров четырьмя шишками были Алан Тьюринг, Джон фон Нейман, Курт Гёдель и Ааронзо Чёрч. Проведено исследование формализованных вычислительных систем.
Докажите предложение через формальную систему:
Системы реального мира можно выразить с помощью простых математических правил.
Недостатки машин Тьюринга и структурных систем фон Неймана
Как видно из приведенных выше изображений и анализа, компьютерные системы машины Тьюринга и системы фон Неймана полагаются на хранилище (память) для операций.
Другими словами:
Модифицируя память, чтобы отразить результат операции. Это не совсем операция.
Мы не хотим изменять память, нам нужны только вычисления. С точки зрения цели можно сказать, что изменение памяти является побочным эффектом в вычислительной системе. Другими словами, это средство выражения результата операции.
Во всем этом доктор Тьюринга, Черч, увидел суть проблемы. Чтобы реализовать суть вычислительной системы - операция, то есть без модификации памяти, результат получается непосредственно через операцию.
он предложилlambdaФормальная система исчисления, теория, более близкая к сущности операции.
Разрыв между функциональными и императивными языками
С точки зрения лингвистической классификации:
два разных типа вычислительных парадигм.
Из аппаратной системы:
Они зависят от их различных компьютерных систем (т.е. оборудования). Причина полагаться на различное оборудование заключается в том, что если вы используете компьютер со структурой фон Неймана, это означает, что вам необходимо модифицировать память для реализации операции. Однако это иlambdaСистемы исчисления противоречивы.
потому что на основеlambdaФункциональный язык, реализованный системой исчисления, не требует регистров, и нет необходимости использовать регистры для хранения состояния переменных. Обращает внимание только на операцию, когда операция закончится, выйдет результат.
Самым большим препятствием является зависимость от различных компьютерных систем.
аппаратные ограничения компьютера
Пока технически невозможноAКомпьютерные системы Paradigm, которые поддерживают обаBпарадигма. То есть нельзя ожидатьX86Появится набор инструкций дляlambdaУчебный, логический или физический дизайн исчисления.
Вы можете задаться вопросом, поскольку аппаратное обеспечение не поддерживает это, почему мы все еще можем заниматься функциональным программированием?
Фактически, большинство людей используют императивный язык системы фон Неймана. Так, чтобы получить особую вычислительную мощность и возможности программирования. Язык представляет собой виртуальную среду на логическом уровне, поэтому он и родился.JSтакой мультипарадигмальный язык, иPYэтот скриптовый язык.
Основная причина в том, что компьютерная система системы фон Неймана основана на системе хранения и инструкций, а не на операции.
Рассвет в темноте
Из-за нехватки аппаратного оборудования в то время Черч предложилlambdaИсчисление долгое время не реализовывалось языками программирования.
Пока фон Нейман и др.EDVACдесять лет спустя. одинMITпрофессорJohn McCarthyИнтерес к работе Черча. существует1958В , он опубликовал язык обработки таблицLISP. этоLISPЯзык для церквиlambdaРеализация исчисления.
С тех пор родился первый в мире функциональный язык.
LISPЭто создатель функциональных языков, полныйlamdaРеализация исчисления, реализация операции является существенной операционной системой.
Картинка вышеLisp, почувствуйте очарование символов на картинке.
Почему я говорю «Рассвет»?
Потому что настоящей победы нет. В настоящее времяLISPВсе еще работал над компьютером фон Неймана, потому что в то время существовала только такая компьютерная система.
Итак, из
LISPВначале функциональные языки работали в интерпретируемой среде, а не в компилируемой. То есть легендарный скриптовый язык, язык-интерпретатор.
настоящая победа
до1973Год,MITГруппа программистов из Лаборатории искусственного интеллекта разработала, известную какLISPаппаратная часть машины. С тех пор Алонзо ЧёрчlambdaНаконец-то исчисление получило аппаратную реализацию. Наконец, компьютерная (аппаратная) система может претендовать на поддержку функциональных языков на уровне машинных инструкций.
Суммировать
Я много объяснял по этому вопросу, от цели рождения функциональных языков до сложного процесса рождения функциональных языков и ограничений компьютерного оборудования. Наконец, при постоянных усилиях можно завершить функциональное программирование компьютерных систем на основе системы фон Неймана через интерпретатор. Чистое функциональное программирование также можно выполнять на компьютерах, поддерживающих функциональные языки на уровне машинных инструкций.
Вопрос для размышления: подумайте, почему в наши дни функциональное программирование становится все более понятным и освоенным.
Что такое система лямбда-исчисления? Что именно говорит лямбда? Как лямбды связаны с функциями? Почему существует система лямбда-исчисления?
Цель, ради которой родилась лямда
lambdaЭто схема работы, которая решает проблему, заключающуюся в том, что семантика функций в математике неясна, и трудно четко выразить структурный уровень функций.
То есть во время работы форма работы функции в функции не используется, а
lambdaФорма операции для выполнения операции.
Краткое введение в лямду
- Система для изучения определения функции, применения функции и рекурсии.
- Числовой язык основан на
lambdaОперационные дженерики, полученные в результате операций.
Теоретический краеугольный камень функционального программирования
lambdaСистема исчисления — очень важная точка знаний для изучения функционального программирования.Это теоретический краеугольный камень всего функционального программирования.
функции в математике
Как показано ниже:
Из приведенной выше математической функции мы можем найти следующее:
- Аргументы данной функции не отображаются
- Различие между определениями и вызовами не является строгим.
x2-2*x+1можно рассматривать как функциюf(x)Определение можно рассматривать как функциюg(x)парная переменнаяx-1вызов.
Испытайте вышеуказанные пункты, мы найдем:
Семантика функций в математике не ясна, и сложно ясно выразить структурный уровень функций. В связи с этим Черч дал решение, он предложилlambda(λ)Исчисление.
лямбда (λ) исчисление
Основная форма определения:
λ.
Определенная таким образом функция называетсяλ(lambda)выражение.
мы можем поставитьlambdaПереводится в функцию, т. е. можно положитьlambdaВыражения читаются как функциональные выражения.
PS:Позвольте мне поговорить об этом здесь, функция в функциональном языке относится к лямбда (функции), которая похожа на наш текущий общий язык, такой как
Cсередина
изfunctionдве разные вещи.
взять каштан
λx.x2-2*x+1только одинλвыражение, в котором явно указаноxявляется переменной. положи этоλКогда определение выражения применяется к определенному значению переменной, выражение должно быть заключено в пару круглых скобок.xда1, как показано ниже
(λx.x2-2*x+1)1
Применение (то есть вызов) процедуры означает присвоение значения переменнойx, и удалитьλ, процесс выглядит следующим образом
(λx.x2-2*x+1)1=1-2*1+1=0
несколько переменных
λx.λy.x+y
x=1, y=2,Процесс вызова выглядит следующим образом
((λx.λy.2*x+y)1) 2 = (λy.2+y) 2 = 4
Видно, что возвращаемое значение функции тоже может быть функцией, так что проблема уровня разных функций тоже решается, и здесь используются функции более высокого порядка. В функциональных языках программирования это правило применяется, когда функции являются гражданами первого класса.
Суммировать
Подумайте об этом хорошенько, и вы найдетеlambdaСистема расчета, простая и красивая. Его можно назвать самым маленьким языком программирования общего назначения.λПроцесс построения системы исчисления — это процесс построения языка программирования с нуля. любой комплекс во всей системеλВыражения составляют:λАбстракция, аппликация и скобки, склеенные вместе.
lambdaСистема исчисления доказывает:
Любая вычислимая функция может быть выражена и вычислена в этой форме, которая эквивалентна машине Тьюринга.
До сих пор я объяснял, почему появились функциональные языки. И важная теоретическая поддержка, поддерживающая функциональные языки ——lambdaПроисхождение и основное содержание системы исчисления.
Зачем использовать функции для реализации функционального программирования?
Как было сказано выше, сущностью вычислительных систем являются вычисления.
Функции — это всего лишь средство инкапсуляции операций, функции — это не настоящая сущность, настоящая сущность заключается в операциях.
Суммировать
Кстати говоря, у всех есть принципиально четкое представление о функциональном программировании. Например, его математическая основа, почему он существует и чем он принципиально отличается от императивных языков.
Что означает слово «функция» в функциональных языках или в функциональном программировании? На что оно способно?
Значение слова функция.
Эта функция специально разработана для удовлетворенияlambdaисчислениеlambdaвыражение. функциональные выражения в функциональном программировании, также известные какlambdaвыражение.
Функция имеет четыре возможности:
- можно назвать
- это операнд
- Данные могут быть сохранены внутри функции
- Операции внутри функции не имеют побочных эффектов вне функции
операнд
существуетJS, функция также является операндом, но ее операция — это только вызов.
Хранить данные внутри функции
Наличие замыканий позволяет сохранять данные в функциях. Когда функция выполняется, данные существуют в разных замыканиях и не будут влиять друг на друга, точно так же, как разные экземпляры в объекте лица имеют свои собственные частные данные. Между несколькими экземплярами нет общих членов класса.
Суммировать
Из этого вопроса мы можем узнать, что это не язык, поддерживающий функции, и этот язык можно назвать функциональным языком или он имеет возможности функционального программирования.
Каковы характерные ключевые слова функционального программирования?
Примерный список:
Ссылочная прозрачность, чистота, отсутствие побочных эффектов, идемпотентность, ленивое вычисление/неленивое вычисление, композиция, каррирование, конвейеры, более высокий порядок, замыкания, неизменность, рекурсия,partial
monad,monadic,functor,applicative, хвостовая рекурсия, строгая/нестрогая оценка, бесконечные потоки и корекурсия, переходы между состояниями,pointfree, первоклассные граждане, неявное программирование/явное программирование и т. д.
ссылочная прозрачность
определение:
Выражение в любой программе, которая соответствует ссылочной прозрачности, может быть заменено его результатом без изменения смысла программы.
значимость:
Пусть код имеет лучший вывод, может быть непосредственно преобразован в результаты.
Например:
такой какTSПеревести вJSпроцесс, если выражение имеет ссылочную прозрачность. Тогда при компиляции можно заранее вычислить результат выражения, а потом сразу стать значением, вJSПри запуске время выполнения уменьшится.
чистота
определение:
Тот же вывод будет возвращен для того же ввода.
преимущество:
- Тестируемый
- Нет побочных эффектов
- параллельный код
- можно кэшировать
Ленивая оценка против неленивой оценки
определение:
Если аргумент оценивается (или оценивается) только тогда, когда его нужно использовать, то он оценивается лениво. И наоборот, это неленивая оценка.
Ленивая оценка:
true || console.log('源码终结者')
Особенности: Когда результат последующего выражения больше не нужен, выполнение последующего выражения прекращается, что повышает скорость и экономит ресурсы.
Неленивая оценка:
let i = 100
console.log(i+=20, i*=2, 'value: '+i)
console.log(i)
Особенности: пустая трата ресурсов процессора, будет неопределенность.
pointfree - неявное программирование
Функция не должна упоминать, с какими данными она собирается работать. То есть вместо указания параметров операции функция позволяет функции, из которой она состоит, обрабатывать параметры.
Обычно реализуется с использованием каррирования и композиции
pointfree
комбинация
карри
Продвинутые знания функционального программирования - Functor, Applicative, Monad
Любого из этих продвинутых пунктов знания достаточно долго объяснять, поэтому я не буду его здесь объяснять. Я рекомендую статью, которая объясняет это очень подробно.
нажмите
TP:Иллюстрация версии машинописного текста Functor, Applicative и Monad
По этим трем продвинутым знаниям у меня есть некоторые личные взгляды.
Первый: Не пугайтесь существительного, почувствуйте разницу, набрав код.
Второе: Поскольку вы хотите понять продвинутые знания функциональных языков, вы должны максимально избавиться от присущих идеям императивных языков, а затем понять эти продвинутые точки знаний.
В-третьих: зачем нужны эти продвинутые знания в функциональном программировании?
Что касается третьей точки зрения, мое личное мнение таково:
Функциональное программирование требует, чтобы вы изменили неявный стиль программирования на явный. Это также означает, что вы тратите много времени на ввод и вывод функции.
Как решить эту проблему?
Это можно сделать с помощью вышеупомянутых расширенных знаний в определенных сценариях, таких какIO, вам не нужно перечислять все возможности, вам просто нужно пройти абстрактный процесс, чтобы обработать все случаи и гарантировать, что исключения не будут выброшены.
Мы можем сравнить эти передовые знания функционального программирования с наследованием объектно-ориентированного программирования, и мы обнаружим, что:
Все они служат одной цели, уменьшая количество повторяющегося кода и улучшая повторное использование кода.
Суммировать
Подробно на этот вопрос я не отвечал, хочу сказать следующее:
Все эти характерные ключевые слова заслуживают серьезного изучения.Здесь я привожу только те моменты, на которые, как мне кажется, следует обратить внимание, и конкретные точки знаний, которые каждый может понять и изучить самостоятельно.
Противоположны ли императивное и функциональное программирование?
Судя по некоторым уточнениям, упомянутым ранее, императивное программирование и функциональное программирование не являются противоположностями. Они могут существовать независимо или симбиотически. А в случае симбиоза она будет оказывать большее влияние.
Лично я считаю, что в области программирования правят мультипарадигмальные языки, и язык программирования, поддерживающий только определенную парадигму, не может адаптироваться к нескольким сценариям.
Согласно FP-мышлению, циклы использовать нельзя, так как же нам решить эту проблему?
Для чисто функциональных языков циклы использовать нельзя. Все, о чем мы можем думать, это использовать рекурсию для реализации циклов, рассматривая вышеупомянутыеlamdaСистема исчисления, которая представляет собой систему для изучения определения функции, применения функции и рекурсии. Таким образом, как функциональный язык, он готов использовать рекурсию для выполнения всех циклических операций.
Генерация исключений может иметь побочные эффекты, но если вы этого не сделаете, то какая альтернатива?
Говоря об этом, нам нужно изменить свое мнение:
Например, в императивных языках мы обычно используемtry catchЭто используется для перехвата выброшенных исключений. Но в чисто функциональных языках нетtry catch, обычно вместо них используются функторыtry catch.
Увидев приведенные выше слова, вы можете почувствовать себя непонятным, зачем вместо этого использовать функторыtry catch.
На самом деле, запутаться — это нормально. Основные причины:
Мы стоим на теоретическом краеугольном камне императивных языков, чтобы понимать функциональные языки.
Если мы будем стоять на теоретическом краеугольном камне функциональных языков и понимать функциональные языки, мы не будем чувствовать себя запутанными. Вы обнаружите, что можете использовать рекурсию только для реализации циклов.try catchи другие требования разумны и уместны.
PS: Это как если бы люди, которые использовали функциональные языки, вдруг столкнулись с императивными языками, и они были бы сбиты с толку.
Запрещает ли функциональное программирование изменяемое состояние? Как выразить нашу программу без побочных эффектов?
Можно использовать локальное изменяемое состояние.Пока локальная переменная не влияет снаружи, можно сказать, что изменение функции в целом не имеет побочных эффектов.
Почему функциональное программирование рекомендует исключать операторы?
Потому что суть утверждения такова:
Он предназначен для описания логики вычисления выражения или для помощи в вычислении выражения.
JavaScript5 вопросов о функциональном программировании
Почему в функциональном программировании следует избегать использования этого
Есть две основные причины:
-
JSизthisЕсть несколько значений и сложных сценариев использования. -
thisНе зависит от кода внутри тела функции. - Все данные должны быть предоставлены функции в качестве параметров, а
thisНе следуйте этому правилу.
Почему цикл for можно использовать внутри функции JS?
Многие, возможно, не задумывались об этом
На самом деле, в чисто функциональных языках оператор цикла отсутствует. Оператор цикла должен быть реализован с использованием рекурсии, ноJSРекурсивная производительность не очень хорошая, например, нет оптимизации хвостовой рекурсии, как это сделать?
Для поддержки функционального программирования необходимо избегатьJSрекурсивные проблемы с производительностью. Наконец, разрешено использовать внутри функцииforцикл и ты увидишьforEach,map,filter,reduceреализацияforЦикл инкапсулирован. до сих пор используется внутриforцикл.
ПС: в
JS, покаforЕсли цикл не влияет снаружи, его можно рассматривать как проявление чистоты.
Что значит для JS-функций быть первоклассными гражданами? Какова цель этого?
Я подытожил, и у меня есть следующее осознание:
- может быть выражена как анонимная прямая величина
- можно хранить в переменной
- Может храниться другими структурами данных
- иметь независимые и определенные имена (например, синтаксические ключевые слова)
- сопоставимый
- Можно передать как параметр
- Может быть возвращено как значение результата функции
- может быть создан во время выполнения
- может быть выражен в сериализованной форме
- читаемый (на естественном языке)
- Читаемый (в форме естественного языка, которую можно передать и сохранить в распределенном или запущенном процессе)
сериализованное выражение формы
Что это за сознание?
существуетjs, мы обнаружим, что существуютevalэтоapi. Именно потому, что он может поддерживать выражение в сериализованной форме, это может быть достигнуто с помощьюevalдля выполнения функции в строковой форме.
Суммировать
JSПервоначальное намерение отца при проектировании функций граждан первого сорта заключалось в том, чтобы сделатьJSЯзык может поддерживать функциональное программирование.
Функции — граждане первого класса, а это значит, что они могут делать все то же, что и значение.
Как сделать функциональное программирование на JS?
Главная мысль:Исключите утверждения с выражениями.
Существуют следующие пути:
- Удалите операторы ветвления с помощью выражений Пример: single
ifоператор, который можно исключить с помощью логического выражения - Устранение циклов с рекурсией функций
- Используйте функцию для замены значения (только возвращаемое значение функции влияет на работу системы, процесс вызова функции фактически эквивалентен только оценке в операции выражения)
Каковы недостатки функционального программирования на JS?
- Отсутствуют неизменяемые структуры данных (
JSВсе, кроме примитивных типов, изменяемы) - Не предоставляет собственный способ объединения функций для создания новых функций, требует сторонней поддержки.
- Ленивые последовательности не поддерживаются
- Отсутствие оптимизации хвостовой рекурсии
-
JSФункция не является функциональной формой истинного чисто функционального языка (такого какJSОператор цикла может быть записан в функции) - Назначение поддержки выражений
Отсутствие оптимизации хвостовой рекурсии
Для функционального программирования отсутствие оптимизации хвостовой рекурсии фатально. На данный момент браузерная поддержка оптимизации хвостовой рекурсии не очень хороша.
Что такое хвостовая рекурсия?
Как показано ниже:
Давайте посмотрим на следующие две картинки
На первом рисунке хвостовая рекурсия не используется, потому чтоn * fatorial(n - 1)это последнее выражение, иfatorial(n - 1)не последнее выражение. На втором рисунке используется хвостовая рекурсия, а последнее выражение — это сама рекурсивная функция.
Вопрос в том, почему
JSКак насчет поддержки плохой хвостовой рекурсии?
Здесь я хочу подчеркнуть, что все языки-переводчики, если нет среды интерпретации,runtime, то это просто куча текста.JSВ основном он работает в браузере и требует, чтобы браузер предоставлял среду интерпретации. Если среда интерпретации браузера правильнаяJSОптимизация хвостовой рекурсии не годится, значит,JSХвостовая рекурсия плохо оптимизирована. Так как есть много браузеров, видныJSДо полной оптимизации хвостовой рекурсии еще далеко.
PS: Любое требование имеет приоритет, для браузеров приоритет такой хвостовой рекурсивной оптимизации явно невысок. Лично я считаю, что низкий приоритет является причиной того, что очень немногие браузеры поддерживают оптимизацию хвостовой рекурсии.
Ссылаться на
Ссылка на ссылку
- Символы: Абстракция, Семантика
- Иллюстрация версии машинописного текста Functor, Applicative и Monad
- Тезис Черча-Тьюринга и лямбда-исчисление
- Зачем вам монады?
- Почему Ю?
Справочная литература
- Руководство по функциональному программированию JavaScript
- Функциональное программирование Scala
- Увлекательное руководство по Haskell
- Другие электронные книги
будущий, многообещающий
Эта статья обеспечивает четкое изложение некоторых теоретических знаний о функциональном программировании путем разработки и опроса. Из-за нехватки места некоторые детали не могут быть расширены.Если у вас есть какие-либо вопросы, вы можете связаться со мной, чтобы общаться и продвигаться вместе.
Передний конец все еще находится в быстром развитии. Ближайшийreact HooksприбытьVue 3.0изFunction API. Мы можем чувствовать, что влияние функционального программирования медленно увеличивается.
В обозримом будущем знание функционального программирования в уме должно иметь четкие когнитивные рамки.
Наконец, вот мое личное мнение:
JavaScript в конечном итоге вернется к тому, чтобы делать большинство вещей в виде функций.
общаться с
Вы можете следить за моим блогом Nuggets илиgithubполучать уведомления о последующих статьях серии.
Серия технических статей Nuggets резюмируется следующим образом: если вы считаете, что это хорошо, нажмите на звездочку, чтобы поощрить это.
Я терминатор исходного кода, и обмен технической информацией приветствуется.
также может войтиГруппа звукозаписи Front-end Rhapsody - Hyun Dance GroupПроведите мозговой штурм вместе.
Язык ветра
Ничего не говорите, сразу переходите к картинке:
Я желаю самому богатому человеку счастливого Национального дняbuff, держись подальшеbug, Счастливый, чтобы закончить семидневный отпуск.
Напоследок: уважайте оригинальность, пожалуйста, указывайте источник для перепечатки 😋