Является ли Javascript функциональным языком программирования? - PullRequest
128 голосов
/ 18 октября 2010

Только потому, что функции являются объектами первого класса, существуют замыкания и функции более высокого порядка, заслуживает ли Javascript называться языком функционального программирования?Я думаю, что главное, чего ему не хватает, - это Pure Functions, и он не «чувствует» себя как другие функциональные языки, такие как lisp (хотя на самом деле это не веская причина, чтобы не быть функциональным языком ...)

Ответы [ 13 ]

172 голосов
/ 18 октября 2010

Повтор мой собственный ответ на аналогичный вопрос,

Нет принятого определения функционального языка программирования.

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

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


Я бы рекомендовал вам прочитать следующие связанные посты в блоге (а также комментарии ниже них):

25 голосов
/ 18 октября 2010

Я бы сказал, что это мультипарадигмальный язык.

РЕДАКТИРОВАТЬ: это мультипарадигма и включает в себя функциональные конструкции.

15 голосов
/ 18 октября 2010

Если вы растянете и перевернете термин «функциональное программирование» до точки философских дискуссий, этот вопрос может снова оказаться открытым. Тем не менее, вы попадаете на уровень полезных вопросов, таких как «Действительно ли C ++ является языком программирования»?

Ответ на ваш вопрос на более дневном уровне: "нет" .

Функциональное программирование означает, что программа концептуализируется как оценка функции, а не потока управления. Код представляет собой описание функций и не имеет внутренней концепции потока управления.

JavaScript имеет поток управления и концептуализируется как императивный язык. С точки зрения дизайна это явно не функциональный язык.

8 голосов
/ 18 октября 2010

Термин «язык функционального программирования» настолько перегружен в наши дни, что почти бесполезен.Есть два доминирующих значения:

  1. Имеет первоклассные функции
    • Это Javascript!
  2. Основано на функциях, используемых влямбда-исчисление, с акцентом на избежание постоянного изменчивого состояния (часто заменяя его параметрами, передаваемыми в функции)
    • Как обычно пишется, Javascript не является этим удаленно!1016 * Укажите ваше значение, и тогда вопрос ответит.
3 голосов
/ 14 июля 2013

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

2 голосов
/ 18 октября 2010

Я склонен не думать о языках программирования как об одной конкретной парадигме, а о том, что они поддаются определенным парадигмам.Однако то, что они поддаются определенной парадигме, не означает, что вы должны использовать эту парадигму.Вполне возможно писать объектно-ориентированные программы на C и писать императивные программы на ML.Не использовать определенную парадигму для решения проблемы, потому что язык не предназначен для этого, просто искусственно ограничивает себя (конечно, вы все равно должны учитывать ограничения языка при принятии решения, будет ли конкретное решение хорошим решением).

2 голосов
/ 18 октября 2010

Для меня Javascript - это и императивный, и функциональный язык, и вы можете использовать его в любом случае, и даже ( egad ) в обоих направлениях. Или вы можете использовать одну парадигму и никогда не трогать другую. Тебе решать. Я, как и вы, не думаю, что Javascript должен называться Функциональным языком, потому что он позволяет вам входить и выходить из парадигмы функционального программирования. Возможно, если бы у него была какая-то прагма, ограничивающая вас использованием только парадигм функционального программирования, то это было бы полезно, я думаю. Но, в заключение, я говорю, что это скорее императивный / процедурный язык с некоторыми функциональными возможностями программирования.

0 голосов
/ 15 мая 2018

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

0 голосов
/ 11 ноября 2016

В Javascript вы можете сделать что-то вроде этого!

// Data
var fruits = [
    { name: 'apple',  price: 5 }, 
    { name: 'orange', price: 10 }, 
    { name: 'lemon',  price: 15 }
]

// Request Data from magicURL
request('magicURL')
    .then(selectKeyOf('price'))
    .then(priceMethod('sum'))
    .then((result)=>{
        console.log(result) // 30
    })

Я создал страницу github для демонстрации этой концепции, и вы можете клонировать / просмотреть мою реализацию

0 голосов
/ 04 октября 2012

@ petraszd Я немного переписал твой код, чтобы получить «новый» оператор для :

   
   function ffor(a, b, f){
     function it(i){
       if(i > b)return
       f(i)
       it(i+1)
     }
     it(a)
   }

   print("----" + new Date()+"----")

   var funcs = []
   ffor(0, 9, function(i){
     funcs.push(function(){return i})
   })

   ffor(0, 9, function(i){
     print(funcs[i]())
   })

Но я знаю, что этот способ имеет недостатки для больших циклов ...

Смежный вопрос об оптимизации хвостовой рекурсии в JS

P.S. Опубликовано здесь, потому что есть проблемы с форматированием кода при публикации в качестве комментария

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...