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

Просто потому, что функции являются объектами первого класса, существуют замыкания и функции более высокого порядка, заслуживает ли Javascript быть названным функциональным языком программирования? Главное, что мне не хватает, это чистые функции, и он не "чувствует" себя, как другие функциональные языки, такие как lisp (хотя на самом деле это не хорошая причина для того, чтобы он не был функциональным langauge...)

Ответ 1

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

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

Если вы определяете функциональный язык как язык, поддерживающий первый класс функции и lambdas, то да, JavaScript * есть * a функциональный язык.

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


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

Ответ 2

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

EDIT: это мультипарадигма и включает в себя функциональные конструкции.

Ответ 3

если вы растягиваете и крутите термин "функциональное программирование" до точки философских дискуссий, этот вопрос может быть снова открыт. Тем не менее, тогда вы оказываетесь на уровне полезных вопросов, таких как "Является ли С++ действительно языком программирования"?

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

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

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

Ответ 4

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

  • Имеет первоклассные функции
    • Javascript это!
  • Основан на функциях, используемых в исчислении лямбда, с упором на предотвращение постоянного изменяемого состояния (часто заменяя его параметрами, передаваемыми на функции)
    • Как обычно написано, Javascript не удаленно это!

Выберите свой смысл, а затем ответ будет отвечать.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

Итак, хотя я бы не сказал, что это так, я думаю, есть место для мнения. У этого есть классические функции функционального программирования, у него нет других.

Ответ 9

Javascript - это точка. Это действительно зависит от того, как вы собираетесь его программировать. Если я буду писать код OO, не будет ли это OO? Поэтому, если вы просто кодируете вещи "функциональным" образом, это будет функционально. Я предполагаю, что это язык с несколькими парадигмами, поэтому назвать его просто не совсем точно.

Ответ 10

@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. Отправленный здесь cuz имеет проблему с форматированием кода во время публикации в качестве комментария

Ответ 11

В 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, чтобы продемонстрировать эту концепцию, и вы можете клонировать/просматривать мою реализацию

Ответ 12

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

Ответ 13

То, что я действительно ненавижу в javascript (если вы пытаетесь посмотреть на него как язык FP), это:

function getTenFunctionsBad() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push(function () {
      return i;
    });
  }
  return result;
}

function getTenFunctions() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push((function (i) {
      return function () {
        return i;
      }
    })(i));
  }
  return result;
}

var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
  // using rhino print
  print(functionsBad[i]() + ', ' + functions[i]());
}

// Output:
//   10, 0
//   10, 1
//   10, 2
//   10, 3
//   10, 4
//   10, 5
//   10, 6
//   10, 7
//   10, 8
//   10, 9

Чтобы понять такое поведение, вам нужно понять среду стека JS (я не знаю, если это правильный термин).

В схеме, например, вы просто не можете произвести такую ​​вещь (Ok, ok - с помощью ссылок на основные языки) Вы можете сделать это:

(define (make-ten-functions)
  (define (iter i)
    (cond ((> i 9) '())
          (else (cons (lambda () i) (iter (+ i 1))))))
  (iter 0))

(for-each (lambda (f)
            (display (f))
            (newline)) (make-ten-functions))