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