Является ли Javascript функциональным языком программирования?

  • Является ли Javascript функциональным языком? Я знаю, что у него есть объекты и amp; вы также можете делать ООП с ним, но также это функциональный язык, можно ли его использовать таким образом?
  • Вы знаете, как ООП стал /кажется следующей эволюцией в программировании, означает ли это, что «Функциональное программирование» является следующей эволюцией (Примечание: это НЕ подсказка для мнения, НО подсказка для фактического доказательства на основе ответа, & amp , эта заметка больше для модераторов, чем авторов;)).
  • Я лучше всего разбираюсь в примерах, может быть, кто-то может показать выполнение одной и той же задачи в режиме ООП & затем в режиме функционального программирования для себя, чтобы понять & сравнить, что такое функциональное программирование.

Я действительно не совсем понимаю «Функциональное программирование», если честно: P Таким образом, сравнение Javascript с функциональным программированием может быть абсолютно неверным.

Поставить функциональное программирование в терминах laymans: это просто преимущество абстракции THROUGH с использованием анонимных функций?

Или это слишком просто? Простым способом ООП является преимущество абстракции через объекты, но я считаю, что это слишком упрощенно для описания ООП.

Является ли это хорошим примером функционального программирования? ...

Пример OOP Javascript:

// sum some numbers
function Number( v )
{ 
  this.val = v;
}

Number.prototype.add( /*Number*/ n2 )
{
    this.val += n2.val;
}

Пример функционального программирования:

function forEach(array, action) 
{
   for (var i = 0; i < array.length; i++)
       action(array[i]);
}  

function add(array)
{
    var i=0;
    forEach(array, function(n)
    {
        i += n;
    });
    return i;
}

var res = add([1,9]);
31 голос | спросил Marek 30 FriEurope/Moscow2011-12-30T11:35:51+04:00Europe/Moscow12bEurope/MoscowFri, 30 Dec 2011 11:35:51 +0400 2011, 11:35:51

5 ответов


66
  

Является ли Javascript функциональным языком? Я знаю, что у него есть объекты и amp; вы также можете делать OOP с ним, но также это функциональный язык, можно ли его использовать таким образом?

Иногда люди скажут функциональное программирование, когда они означают императивное программирование или процедурное программирование . Строго говоря, функциональное программирование :

  

В информатике функциональное программирование представляет собой парадигму программирования, в которой рассматривает вычисления как оценку математических функций и избегает состояния и изменяемых данных . Он подчеркивает применение функций, в отличие от императивного стиля программирования, который подчеркивает изменения в состоянии. Функциональное программирование имеет свои корни в лямбда-исчислении, формальной системе, разработанной в 1930-х годах для исследования определения функции, применения функций и рекурсии. Многие языки функционального программирования можно рассматривать как разработки по лямбда-исчислению.

Хотя Javascript не широко известен или используется как функциональный язык, он имеет некоторые функциональные элементы :

  

JavaScript имеет много общего с Scheme. Это динамический язык. Он имеет гибкий тип данных (массивы), которые могут легко имитировать s-выражения. И самое главное, функции - лямбды.

Схема - это диалект ориентации объектов , Javascript является объектно-ориентированным языком. Но его объектная ориентация - прототип :

  

Программирование на основе прототипа - это стиль объектно-ориентированного программирования, в котором классов нет, а повторное использование поведения (называемое наследованием на языках класса) выполняется посредством процесса клонирования существующих объектов, которые служат прототипами. Эта модель также может быть известна как бесклассовое, прототип-ориентированное или основанное на экземпляре программирование. Делегирование - это языковая функция, которая поддерживает программирование на основе прототипов.

Итак, хотя Javascript объектно ориентирован, он не следует более распространенной модели, основанной на классе , как это делают языки как C ++, C #, Java и PHP (и немало других). И, конечно же, это также императивный язык, который приводит к путанице с функциональным программированием, описанным выше.

  

Вы знаете, как ООП стал /кажется следующей эволюцией в программировании, означает ли это, что «Функциональное программирование» является следующей эволюцией

Ориентация объектов и функциональное программирование - это всего лишь две из многих различных парадигм программирования , это разные стили программирования с разными концепций и абстракций. Ключевое слово «другое». Существует не одна парадигма, которая лучше других или более развита, чем другие, каждый из них подходит для некоторых сценариев лучше, чем другие. Некоторые из них могут быть более старыми по происхождению, чем другие, но в эволюционных терминах, которые делают их лучше, поскольку они выжили дольше. Но это не очень умный способ взглянуть на него.

Javascript, как я описал выше, и как еще несколько других языков, является мультипарадигмой. Он позволяет писать код в императивном, основанном на прототипе объектно-ориентированном и функциональном стиле. Вам решать, какой из них лучше всего подходитнезависимо от того, что вы строите. Существует также несколько отдельных языков парадигмы, канонический пример - Java, который допускает только объектно-ориентированное программирование на основе классов 1 .

Вы действительно должны противостоять любому желанию относиться к языкам и amp; парадигмы как заявления моды. Там есть оскорбление дерьма, в основном написанное фанатами /фангиллами или людьми с маркетингом, с небольшими (если есть) знаниями и пониманием программирования. Такие термины, как «лучше», «более развитые» и т. Д., Просто не применяются.

  

Я лучше всего разбираюсь в примерах, может быть, кто-то может показать выполнение одной и той же задачи в режиме ООП & затем в режиме функционального программирования для себя, чтобы понять & сравнить, что такое функциональное программирование.

Это был бы ужасный способ узнать. Функциональная и объектная ориентация - совершенно разные стили, и любой пример, отличный от ужасно простых, не соответствовал бы одному или другому стилю.

1 Но в последнее время мы пытаемся расширить его область применения до общего программирования, посмотрим, как это происходит.


В заключение:

  • Сосредоточьтесь на изучении Javascript, это прекрасный и чрезвычайно полезный язык. Изучите язык, а не рекламу.
  • Довольно много разных парадигм, все одинаково полезны. Вы можете выбрать, какой из них вы предпочитаете, и который подходит лучше всего, что вы строите.
  • Если вы хотите изучить функциональное программирование, выберите более подходящий язык, например Scheme или Clojure . Но сначала вам нужно понять математические концепции.
  • Проведите некоторое исследование, прежде чем спросить. На большинство ваших вопросов отвечают соответствующие статьи в Википедии. Знание того, как исследовать и как спросить, является чрезвычайно важным навыком для любого программиста.
ответил yannis 30 FriEurope/Moscow2011-12-30T12:05:34+04:00Europe/Moscow12bEurope/MoscowFri, 30 Dec 2011 12:05:34 +0400 2011, 12:05:34
7

Javascript может использоваться как функциональный язык, на самом деле он делает это довольно хорошо. Можно реализовать монады поддерживает конструкцию лямбда и т. Д. Это не исключительно функциональный язык, поскольку он также имеет много объектно-ориентированных функций, но его можно использовать таким образом. На самом деле я считаю, что использование Javascript в качестве функционального языка - отличный способ его использования. (Пример jQuery и underscore.js)

ответил Zachary K 30 FriEurope/Moscow2011-12-30T14:50:17+04:00Europe/Moscow12bEurope/MoscowFri, 30 Dec 2011 14:50:17 +0400 2011, 14:50:17
6

Эволюция обычно означает изменение incremental . ООП не является дополнительным дополнением к процедурному программированию - на самом деле он полностью ортогонален базовой модели программирования и может быть объединен с любым из них. Функциональное программирование не является дополнительным дополнением к процедурной, ООП или тому подобное - это альтернативный базис для выражения фундаментальных принципов вычислений, и на самом деле это первая такая основа, когда-либо сформулированная, задолго до появления первых компьютеров. Важно понимать, что все такие фундаментальные системы эквивалентны (т. Е. Можно выразить через другое).

Чтобы понять функциональный подход, сначала необходимо получить базовую математику . Если вы хотите получить представление о том, что означает код в функциональном стиле в Javascript, начните использовать JQuery .

ответил SK-logic 30 FriEurope/Moscow2011-12-30T12:34:17+04:00Europe/Moscow12bEurope/MoscowFri, 30 Dec 2011 12:34:17 +0400 2011, 12:34:17
2

Нет

JavaScript - это объектно-ориентированный язык в первую очередь.

Это не означает, что вы не можете писать программы JavaScript в функциональном стиле, так как вы можете использовать функциональный стиль в любом Turing полном языке, если вы достаточно усердствуете. Вы можете выполнять функциональное программирование на ассемблере, если хотите. Но это not делает каждый язык функциональным. Вы можете в равной степени также называть Haskell императивом, или Java логическим языком программирования - если вы примете этот подход, условия скоро станут бессмысленными.

ИМО способ классификации языка в соответствующей парадигме состоит в том, чтобы рассмотреть:

  • Каков доминирующий стиль, поддерживаемый языковыми конструкциями (очевидно, ООП для JavaScript, функциональные языки вместо этого подчеркивают функции и неизменные значения данных).
  • Какая парадигма поддерживается в основных библиотеках языка (опять-таки ООП для JavaScript)
  • Какие функции отключены или обескуражены на языке (функциональные языки препятствуют или запрещают изменяемые переменные, что не относится к JavaScript).
  • Какой стиль развития распространен в сообществе разработчиков, использующих язык (опять же, ООП явно распространен в мире JavaScript).

Лично я считаю довольно забавным, что многие люди любят требовать языка, являются «функциональными» только потому, что это модный термин на данный момент: -)

Если вы хотите немного долгую, но интересную перспективу в программировании парадигм за эти годы, стоит посмотреть Видео Дяди Боб Мартина« Последний язык программирования ». Для меня большое понимание этого разговора заключалось в том, что парадигмы программирования определяются , какие функции они убирают , а не какие функции они вставляют ......

ответил mikera 12 Jpm1000000pmThu, 12 Jan 2012 13:02:23 +040012 2012, 13:02:23
2

Javascript сначала прототип, с функциональными возможностями - предоставляется его использованием функций в качестве объектов первого класса.

Это означает, что вы можете использовать функции как данные, которые имеют любопытный эффект уменьшения необходимости в переменных, поддерживающих состояние. Если вы обнаружите, что сами достигаете инструкции var или используете одно или несколько операторов if, вы отклоняетесь от функционального стиля.

Еще одна заметная особенность функционального стиля заключается в том, что функции должны ТОЛЬКО возвращать результат их оценки и не иметь побочных эффектов для состояния вне их области:

// oops, this is producing a side effect
function sideEffecter(){//theres no input...        
    window.thingy = 'foo';
    // hey, this isn't returning anything!!!
} 

Функциональные языки являются неразрушающими - это означает, что они не мутируют ввод, а скорее возвращают совершенно новые данные на основе ввода. См. Эту тему: https://stackoverflow.com/questions/749084/jquery-map-vs-each

Функциональные языки также содержат множество общих методов - с такими именами, как «карта», «сгиб», «сокращение» этих списков /коллекций процессов. В JS, в отличие от других языков, мы должны приводить их в действие - см. Библиотеки типа underscore.js для некоторых примеров, хотя в последней версии JS есть некоторые из них прямо из коробки.

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

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

var test = ['foo', 'bar', 'baz'], removeFunc, removeLoop;

//(semi)functional style...
// to be really functional each condition in the ternary would be another function
removeFunc = function(src, trg) {
    return src.length === 0 ? 
        src : 
            src[0] === trg ? 
                src.slice(1) : 
                    [src[0]].concat(removeFunc(src.slice(1), trg));
};

//but this is faster
removeLoop = function(src, trg){
    var len = src.length, // using variables to represent state...
        i=0, 
        result = [];        
    while(i < n){
       if(src[i] !== trg){
          result.push(src[i]);
       }
       i = i+1;
    }
}

Кроме того, если вы используете функциональную конструкцию для попадания в циклы значительного размера и не используете какую-либо форму управления специальными стеками, вы можете наполнить стек (хотя, если быть справедливым, вам нужен БОЛЬШОЙ список для этого происходить...). Вы также должны учитывать возможность оптимизации вариантов в каждом браузере, хотя, если вы работаете в среде Node.js, это, очевидно, больше фиксированной цели.

Это не означает, что вы не должны использовать функциональные конструкции в Javascript - просто отдавайте себе отчет в ограничениях в его реализации по сравнению с его средой.

Вот некоторые ссылки, которые могут вас заинтересовать:

Хорошая глава по функциональному программированию в Javascript от превосходного «Красноречивого Javascript»

The Little Schemer

мой друг написал JS-библиотеку на основе Little Schemer

Хороший учебник по Схеме, который может помочь вам лучше понимать FP

ответил sunwukung 13 Jpm1000000pmFri, 13 Jan 2012 14:02:07 +040012 2012, 14:02:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132