자바 스크립트는 함수형 프로그래밍 언어입니까?


135

함수가 일급 객체이기 때문에 클로저 및 고차 함수가 있으므로 Javascript는 함수형 프로그래밍 언어라고 할 가치가 있습니까? 내가 부족하다고 생각하는 가장 중요한 것은 순수 함수이며 lisp와 같은 다른 기능적 언어와 같은 느낌이 들지 않습니다 (실제로 기능적인 언어가되지 않는 좋은 이유는 아니지만 ...)


12
@ 슬래시 마이스 : 아니오! 그것은 순수한 기능적 언어가되는 것을 막습니다. ML (적어도 현대적인 방언)도

4
일반적으로 기능적으로 간주되지만 순수하지 않은 언어가 많이 있습니다. 그것이 어떻게 요구되는지 모르겠습니다. 그렇게 엄격하고 싶다면 대부분의 소위 OOP 언어도 OOP가 아닙니다. 모든 언어의 약 95 %가 패러다임없는 언어입니다.
jalf

6
그래도 왜 중요합니까? C ++로 코딩 할 때 언어가 "OOP"인지 여부는 상관하지 않습니다. 특정 OOP 기능이 있고 몇 가지 기능적 프로그래밍 기능과 많은 명령형 프로그래밍 기능 및 많은 일반 프로그래밍 기능이 있습니다. 그러나 그것이 "OPS 언어"인지 FP 언어인지 또는 다른 것은 중요하지 않습니다. 마찬가지로 JS로 코딩 할 때 FP인지 여부는 중요하지 않습니다. 중요한 것은 훌륭한 FP 기능을 많이 지원한다는 것입니다. 이것이 잘못된 질문 인 것 같습니다.
jalf

3
@hvgotcodes : 그래서? 그렇지 않다는 규칙은 전혀 없습니다. 제 경험에 의하면, 기능적인 스타일로 프로그래밍 할 수 있다면 언어는 기능적인 언어입니다. Javascript에는 일급 함수, 클로저 및 람다가 있기 때문에 가능한 한 기능적인 언어라고 생각합니다. 물론 순수한 것은 아니지만 우리가 일반적으로 FP (예 : SML)로 간주하는 대부분의 언어는 아닙니다. 정말로, 나는 당신이 풀어야한다고 생각합니다. 그것이 시선을 사로 잡으면 의사를 만나야합니다.
jalf

3
@jalf, 절대적으로. 이 질문에 대한 동기는 저보다 똑똑한 동료와 사람들이 어떻게 생각하는지 알고 싶었습니다.
hvgotcodes

답변:


180

비슷한 질문에 대한 내 대답 을 반복 하면서

함수형 프로그래밍 언어에 대한 정의가 없습니다.

함수 언어를 퍼스트 클래스 함수와 람다를 지원하는 언어로 정의하면 JavaScript는 함수 언어입니다.

불변성 지원, 대수적 데이터 유형, 패턴 일치, 부분 적용 등의 요소를 고려한다면 JavaScript는 기능적 언어가 아닙니다.


다음과 같은 관련 블로그 게시물 (및 해당 게시물 아래에있는 의견)을 읽어 보시기 바랍니다.


29
+1은 보편적 인 정의가 없음을 지적하고 JS에없는 전형적인 기능적 언어 기능의 예를 제공합니다.

1
(1.7 응시) 자바 스크립트의 모질라의 구현의 최신 버전은 destructuring 할당의 형태로 패턴 매칭이 있습니다 developer.mozilla.org/en/New_in_JavaScript_1.7#section_20
jbeard4

JavaScript에는 부분적 개념과 부분적으로 매개 변수 적용이라는 개념이 있으므로이를 지원하지 않는다는 진술이 올바르지 않은지 궁금합니다.
johnbakers

2
@OpenLearner, 부분 응용 프로그램은 C조차도 내가 생각할 수있는 거의 모든 언어로 지원됩니다. JS의 경우도 다르지 않습니다. 요점은 부분적 적용이 그 언어에서 수월하고 일류인지 여부입니다. JS에서는 그렇지 않습니다. 무슨 뜻인지 궁금하다면 OCaml 또는 Haskell을 살펴보십시오.
missingfaktor

JavaScript는 불변성 afaik을 지원합니다.
fka

26

나는 그것이 다중 패러다임 언어라고 말할 것입니다.

편집 : 그것은 다중 패러다임이며 기능적인 구성을 포함합니다.


그래, 나는 그것이 혼합이고 여러 가지 다른 것에 동의한다.
Ashley Grenon

5
그러나 그것은 그것이 또한 기능적 인지에 대한 질문에 대답하지 않습니다 . 다중 패러다임은 다중 패러다임을 지원함을 의미합니다. 이러한 패러다임 중 하나가 기능적 프로그래밍입니까?
jalf

15

"기능적 프로그래밍"이라는 용어를 철학적 토론의 요점으로 확장하고 왜곡 시키면이 질문이 다시 열릴 수 있습니다. 그러나 "C ++는 실제로 프로그래밍 언어입니까?"와 같은 유용한 질문의 수준에 도달하게됩니다.

보다 일상적인 질문에 대한 답변은 "아니오" 입니다.

기능적 프로그래밍은 프로그램이 제어 흐름이 아니라 기능의 평가로 개념화됨을 의미합니다. 코드는 함수에 대한 설명이며 제어 흐름에 대한 고유 한 개념이 없습니다.

JavaScript에는 제어 흐름이 있으며 명령형 언어로 개념화됩니다. 디자인 목적 상 분명히 기능적인 언어는 아닙니다.


1
디자인 목표? 무슨 소리 야? 마지막으로, 그 영감의 원천 중 하나는 계획이었습니다. 나는 그것의 설계 목표 중 하나는 함수형 프로그래밍을 지원하는 것을 매우 분명하다 말할 것 뿐만 아니라 다른 패러다임의 bucketful
jalf을

2
이를 위해 적절한 기초를 직접 작성하는 경우 C ++만큼 기능적 프로그래밍을 지원합니다. 예를 들어, Haskell에서 약간의 작업으로 명령 구문을 에뮬레이트 할 수 있습니다. 그럼에도 불구하고 JavaScript의 구문은 함수 평가보다는 작업 흐름을 생각하게합니다. 이러한 이유로, 나는 (또는 대부분의 기능 프로그래머) "기능"이라는 용어를 너무 광범위하게 적용하는 것을 고려합니다.
shuhalo

@ user411768 : 언어가 작동하는지 여부는 표준 라이브러리의 디자인에 달려 있습니까? 나는 정의를 들어 본 적이 없다 . Java에는 C ++ (현재)와 달리 기능 스타일 (예 : 클로저 및 익명 함수)로 프로그래밍하는 데 필요한 대부분의 도구가 있습니다. 나는 그것이 C ++보다 JS를 훨씬 더 FP로 만든다고 생각합니다. 이 언어 로 인해 FP 스타일로 프로그래밍 하도록 강요 하지 않는다고해서 "기능이 부족"하지는 않습니까?
jalf

1
(i) 표준 라이브러리는 구문 기능과 마찬가지로 표준의 일부이며 특정 관용적이고 개념적 스타일을 강조합니다. 예를 들어 "STL이있는 C ++"은 "클래스가있는 C"와 매우 다릅니다. 영향을 미칩니다. (ii) JavaScript는 객체 지향, 일류 시민권 자 기능을 특징으로합니다.이 기능은 구현 / 기능적 이분법과 직교합니다. 그러나 카레를 직접 구현하거나 순도를 제공하지도 않으며, 의도 한 것도 아닙니다. (iii) 마지막 말은 게시물의 첫 단락을 참조하십시오.
shuhalo

3
JavaScript와 C ++가 동일한 기능적 프로그래밍 편의성을 제공한다는 진술은 확실히 잘못되었습니다. JavaScript는 동일한 것을 달성하기 위해 C ++에서 수행해야하는 복잡한 구성없이 기능 프로그래밍을 매우 간단하고 간단하게 만듭니다. C ++에서는 함수형 프로그래밍이 실제로 권장되지 않는다고 말하는 훌륭한 C ++ 코더가 많이 있지만, JavaScript에서 함수형 프로그래밍을 수행하는 데 대한 기사는 풍부합니다
johnbakers

9

"기능 프로그래밍"언어라는 용어는 요즘 너무 과부하되어 거의 쓸모가 없습니다. 두 가지 주요 의미가 있습니다.

  1. 일급 기능이 있습니다
    • Javascript는 이쪽!
  2. 지속적인 변경 가능한 상태를 피하는 데 중점을두고 람다 미적분학에서 사용되는 함수를 기반으로합니다 (종종 함수에 전달 된 매개 변수로 대체)
    • 일반적으로 작성된 것처럼 Javascript는 원격이 아닙니다!

의미를 고르면 질문에 대답 할 수 있습니다.


"기능 프로그래밍"을 사용하여 1 차 시민이되는 기능을 가진 언어를 참조하는 소스가 있습니까?
shuhalo

@ user411768 : 사실, 다른 답변자는 Wikipedia의 기사에 링크되어 있으며, 그 정의를 사용합니다. en.wikipedia.org/wiki/ 자바 스크립트 — Joel Spolsky는 또한 "프로그램 언어로 할 수 있습니까?" "기능적 프로그래밍"의 장점에 관한 글
Chuck

당신은 자바 스크립트를 두 번째 지점을 사용하지 않는, 일반적으로 작성된, 그주의,하지만 확실히 확실히 않기 때문에, 언어가 이러한 기능을 지원하지 않는, 그리고 정확하게 일을하지 프로그래머가 있다는 것을 의미하지 않는다
johnbakers

@OpenLearner : 음, 그래,하지만 같은 자바 일반적으로 엄격하게 필수적으로 간주되는 다른 언어의 많은 사실이다 - 당신은 수있는 기능 스타일을 쓸 수 있지만 그것은 언어의 행복 경로 아니다.
Chuck

...하지만 최신 JS가 지원합니다.
Erik Reppen December

3

함수형 프로그래밍에 대한 구체적인 정의는 없다고 생각하지만, 사람들이 "함수형 프로그래밍"을 자바 스크립트로 수행 할 수 있다고 생각하는 많은 것들이 있습니다. 다음은이 기사의 간단한 예입니다 .


2

나에게 Javascript는 명령형 언어이며 기능적 언어이며, 두 가지 방법 중 하나를 사용하거나 두 가지 방법으로 ( egad ) 사용할 수 있습니다 . 또는 한 패러다임을 사용하도록 선택하고 다른 패러다임을 절대 만지지 마십시오. 그것은 당신에게 달려 있습니다. 나는 당신과 마찬가지로 Javascript가 함수형 프로그래밍 패러다임을 방황 할 수 있기 때문에 함수형 언어 라고 해야한다고 생각하지 않습니다 . 아마도 기능적인 프로그래밍 패러다임 만 사용하는 것을 제한하기 위해 일종의 pragma가 있다면 유용 할 것입니다. 그러나 요약하자면, 기능적 프로그래밍 기능을 갖춘 명령형 / 절차 적 언어에 가깝습니다.


이러한 추론에 의해 F #은 더 이상 기능적이라고 할 수 없습니다.
Eric Mickelsen

1
권리. Wikipedia에 따르면 F #은 내가 방금 Javascript라고했던 것입니다. "F # [...]은 함수형 프로그래밍뿐만 아니라 명령형 객체 지향 프로그래밍 분야를 포함하는 다중 패러다임 프로그래밍 언어입니다."
Brian Onn

2

나는 프로그래밍 언어가 하나의 특정 패러다임을 가지고 있다고 생각하지는 않지만 특정 패러다임을 빌려주는 경향이 있습니다. 그러나 그들이 특정 패러다임을 빌려 준다고해서 그 패러다임을 사용해야한다는 것은 아닙니다. C에서는 객체 지향 프로그램을 작성하고 ML에서는 명령형 프로그램을 작성할 수 있습니다. 언어가 의도적으로 인위적으로 제한되어 있지 않기 때문에 문제를 해결하기 위해 특정 패러다임을 사용하지 마십시오 (물론 특정 솔루션이 좋은 솔루션인지 결정할 때 언어의 한계를 고려해야합니다).


0

글쎄, 나는 그것이 함수형 프로그래밍의 언급하지 않았다, 그러나 나는 그것의 객체 지향 그냥 오늘 친구가 그 중 하나가 선반에 넣어하지 것이라고 말했다 말한다.

그래서 말하지는 않지만 의견의 여지가 있다고 생각합니다. 함수형 프로그래밍의 고전적인 기능을 가지고 있으며 다른 기능은 없습니다.


2
JavaScript는 객체 지향입니다. OO에는 클래스가 필요하지 않지만 객체가 필요합니다.
시크릿

3
자바 스크립트는 객체 지향적이 아니며 프로토 타입 기반입니다.
Kris

1
JavaScript는 프로그래밍 수프입니다. 이것과 조금.
Andrew S

0

자바 스크립트는 요점입니다. 그것은 당신이 그것을 프로그래밍하는 방법에 달려 있습니다. OO 방식으로 코딩하면 OO가 아닐까요? 따라서 '기능적'방식으로 만 코드를 작성하면 기능적입니다. 다중 패러다임 언어 인 것 같아서 한 가지만 말하는 것이 완전히 정확하지는 않습니다.


0

@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의 꼬리 재귀 최적화에 대한 관련 질문

추신 : 여기에 게시 cuz는 의견으로 게시하는 동안 코드 형식에 문제가 있습니다


0

자바 스크립트에서는 이런 식으로 할 수 있습니다 !!

// 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

함수형 프로그래밍 언어는 함수의 요소 (상태)를 변경하거나 변경할 수 없지만 자바 스크립트에서는 함수를 일급 시민으로 취급하지만 함수형 프로그래밍 언어는 아닙니다.


-2

내가 실제로 자바 스크립트에서 싫어하는 것은 (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))

1
흠, Javascript는 variable에 대한 참조를 보유 하지만 value에 대한 참조는 보유하지 않는다고 생각 합니다 .
aeracode

1
변수 범위를 이해하는 것은 모든 언어에서 효과적인 프로그래밍에 중요합니다. 이것에 자바 스크립트 만있는 것은 아닙니다.
rich remer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.