함수가 일급 객체이기 때문에 클로저 및 고차 함수가 있으므로 Javascript는 함수형 프로그래밍 언어라고 할 가치가 있습니까? 내가 부족하다고 생각하는 가장 중요한 것은 순수 함수이며 lisp와 같은 다른 기능적 언어와 같은 느낌이 들지 않습니다 (실제로 기능적인 언어가되지 않는 좋은 이유는 아니지만 ...)
함수가 일급 객체이기 때문에 클로저 및 고차 함수가 있으므로 Javascript는 함수형 프로그래밍 언어라고 할 가치가 있습니까? 내가 부족하다고 생각하는 가장 중요한 것은 순수 함수이며 lisp와 같은 다른 기능적 언어와 같은 느낌이 들지 않습니다 (실제로 기능적인 언어가되지 않는 좋은 이유는 아니지만 ...)
답변:
비슷한 질문에 대한 내 대답 을 반복 하면서
함수형 프로그래밍 언어에 대한 정의가 없습니다.
함수 언어를 퍼스트 클래스 함수와 람다를 지원하는 언어로 정의하면 JavaScript는 함수 언어입니다.
불변성 지원, 대수적 데이터 유형, 패턴 일치, 부분 적용 등의 요소를 고려한다면 JavaScript는 기능적 언어가 아닙니다.
다음과 같은 관련 블로그 게시물 (및 해당 게시물 아래에있는 의견)을 읽어 보시기 바랍니다.
나는 그것이 다중 패러다임 언어라고 말할 것입니다.
편집 : 그것은 다중 패러다임이며 기능적인 구성을 포함합니다.
"기능적 프로그래밍"이라는 용어를 철학적 토론의 요점으로 확장하고 왜곡 시키면이 질문이 다시 열릴 수 있습니다. 그러나 "C ++는 실제로 프로그래밍 언어입니까?"와 같은 유용한 질문의 수준에 도달하게됩니다.
보다 일상적인 질문에 대한 답변은 "아니오" 입니다.
기능적 프로그래밍은 프로그램이 제어 흐름이 아니라 기능의 평가로 개념화됨을 의미합니다. 코드는 함수에 대한 설명이며 제어 흐름에 대한 고유 한 개념이 없습니다.
JavaScript에는 제어 흐름이 있으며 명령형 언어로 개념화됩니다. 디자인 목적 상 분명히 기능적인 언어는 아닙니다.
"기능 프로그래밍"언어라는 용어는 요즘 너무 과부하되어 거의 쓸모가 없습니다. 두 가지 주요 의미가 있습니다.
의미를 고르면 질문에 대답 할 수 있습니다.
나에게 Javascript는 명령형 언어이며 기능적 언어이며, 두 가지 방법 중 하나를 사용하거나 두 가지 방법으로 ( egad ) 사용할 수 있습니다 . 또는 한 패러다임을 사용하도록 선택하고 다른 패러다임을 절대 만지지 마십시오. 그것은 당신에게 달려 있습니다. 나는 당신과 마찬가지로 Javascript가 함수형 프로그래밍 패러다임을 방황 할 수 있기 때문에 함수형 언어 라고 해야한다고 생각하지 않습니다 . 아마도 기능적인 프로그래밍 패러다임 만 사용하는 것을 제한하기 위해 일종의 pragma가 있다면 유용 할 것입니다. 그러나 요약하자면, 기능적 프로그래밍 기능을 갖춘 명령형 / 절차 적 언어에 가깝습니다.
글쎄, 나는 그것이 함수형 프로그래밍의 언급하지 않았다, 그러나 나는 것 그것의 객체 지향 그냥 오늘 친구가 그 중 하나가 선반에 넣어하지 것이라고 말했다 말한다.
그래서 말하지는 않지만 의견의 여지가 있다고 생각합니다. 함수형 프로그래밍의 고전적인 기능을 가지고 있으며 다른 기능은 없습니다.
자바 스크립트는 요점입니다. 그것은 당신이 그것을 프로그래밍하는 방법에 달려 있습니다. OO 방식으로 코딩하면 OO가 아닐까요? 따라서 '기능적'방식으로 만 코드를 작성하면 기능적입니다. 다중 패러다임 언어 인 것 같아서 한 가지만 말하는 것이 완전히 정확하지는 않습니다.
@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]())
})
그러나이 방법은 큰 루프에 단점이 있다는 것을 알고 있습니다 ...
추신 : 여기에 게시 cuz는 의견으로 게시하는 동안 코드 형식에 문제가 있습니다
자바 스크립트에서는 이런 식으로 할 수 있습니다 !!
// 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 페이지 를 만들었으며 구현을 복제 / 볼 수 있습니다
내가 실제로 자바 스크립트에서 싫어하는 것은 (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))