Programing

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

lottogame 2020. 7. 1. 07:58
반응형

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


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


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

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

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

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


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


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

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


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

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

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

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


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

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

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


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


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


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


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

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


자바 스크립트는 요점입니다. 그것은 당신이 그것을 프로그래밍하는 방법에 달려 있습니다. 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]())
   })

그러나이 방법은 큰 루프에 단점이 있다는 것을 알고 있습니다 ...

JS의 꼬리 재귀 최적화에 대한 관련 질문

추신 : 여기에 게시 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
    })

I have made a github page in order to demo this concept and you can clone/view my implementation


As we know the functional programming language doesn't allow to change or mutate the elements(state)of functions but in javascript it is allowed in that sense it is not a functional programming language, although it does treat function as first class citizens.


What I really hate in javascript (if You try to look at it as FP language) is this:

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

You need to understand JS stack environment (I don't if it is the right term) to understand such a behavior.

In scheme for example You just can't produce such thing (Ok, ok -- with the help of underlying languages' references You can make it):

(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))

참고URL : https://stackoverflow.com/questions/3962604/is-javascript-a-functional-programming-language

반응형