2013-10-27 1 views
5

나는 Misko Hevery가 작성한 깨끗한 코드에 대한 이야기를보고 있었고, 작업을 시뮬레이션하기 위해 if 문이없는 프로그램을 작성하려고했으나 (인간 답게 가능한 적은) 프로그램을 작성하려고했습니다. 스몰 토크 또는 일부 언어는 다형성이 인라인 조건부 동작보다 선호되는 언어입니다.JavaScript에서 함수형 프로그래밍을 시뮬레이션하는 데 사용할 수있는 제한이 있습니까?

필자의 제한된 방법론은 기능적 프로그램에서 표현할 수있는 방법이 없기 때문에 필자의 제한된 이해로만 필자는 저와 같은 멀리 떨어져있는 프로그래머에게 기능적 프로그래밍을 어렵게 만듭니다. 함수는 값을 취하여 값을 반환하고 상태에 대해 아무것도 모릅니다.

나는 JS가 기능 모델을 지원할 수 있다고 환영 받았다.

첫 번째 단락과 유사한 간단한 제한 사항이 있으므로 완전히 새로운 언어를 배우기보다는 내가 아는 언어로 기능적 패러다임을 시험해 볼 수있게 될 것입니다. 결국 나는 지금 정신을 시험해보고 싶다)?

+1

나는 이것이 어떤 유형의 답변을 얻는 지 정말로 기대하고 있습니다. 개인적으로 Javascript로 구현하기 전에 기능적 언어를 조금 배우는 것이 더 쉬울 수도 있습니다. 보십시오 [당신에게 하스켈을 배우십시오] (http://learnyouahaskell.com/). 기본은 어렵지 않으며 기능적 사고의 장애물을 극복하는 데 도움이됩니다. – dg123

답변

5

"함수 프로그래밍"이라는 용어에는 두 가지 의미가 있습니다.

첫 번째 의미는 프로그램이 기능을 조작 할 수있는 능력입니다. 모든 언어가 이것을 할 수있는 것은 아니지만 자바 스크립트는 가능한 언어 중 하나입니다. 함수를 변수에 할당하고, 함수를 인수로 전달하고, 함수를 반환하는 함수를 함수형 프로그래밍 언어라고하며, 자바 스크립트는 그대로 작동합니다.

이러한 의미에서 콜백이 널리 사용되는 현대 자바 스크립트 코드를 살펴보면 이미 함수형 프로그래밍을 수행하고있는 것입니다.

함수 프로그래밍의 두 번째 의미는 프로그램 작성의 기본 방법이 변수가 아닌 함수 인 프로그래밍 스타일입니다. 이런 의미에서 변수 할당과 루프 구조 (대신 재귀 사용)를 피함으로써 거의 모든 언어를 함수 스타일로 사용할 수 있습니다.

기능 공동체를 살펴보면 기능적으로 의미하는 것은 첫 번째 의미와 두 번째 의미의 매우 강력한 버전입니다. 즉, 변수는 피할 수 없지만 금지됩니다. Haskell과 같은 언어에는 변수 개념이 없습니다. I/O와 같은 부작용과 변경 가능한 상태를 처리하기 위해 모나드라는 개념을 사용합니다.

그렇게 멀리 가지 않아도됩니다. Lisp과 Forth와 같은 고전적인 기능 언어는 변수를 허용했다. 당신은 가능한 한 그들을 피해야합니다.

Lisp 및 Forth 스타일 함수 프로그래밍은 임시 변수에 아무 것도 지정하지 않고리스트/배열을 처리함으로써 크게 유도됩니다. 어떤 사람들에게는이 스타일을 읽기가 더 쉽습니다. 필수적 스타일이 할 줄 경우 : 기능적인 스타일에

var a = [1,2,3]; 
var b = 0; 
for (var i=0;i=a.length;i++) { 
    b += a[i] * 2; 
} 
// result is in b 

당신이 할 거라고 :

[1,2,3]. 
    map(function(x){return x*2}). 
    reduce(function(x,y){return x+y},0); 

개념적으로, 기능적인 스타일이 대신 배열에 필터를 적용하는 것처럼 보이게 만든다 배열을 반복하는 것. grep과 같은 명령 줄 도구를 사용한 적이 있다면이 개념을 매우 잘 알고있을 것입니다.

기능적 스타일에서 변수 할당을 전혀 도입하지 않았다는 것에 주목하십시오.

기능적 스타일의 3 가지 핵심 배열 방법/기능은 map, reducefilter입니다. 그들로 90 % for-loops와 같은 것을 피할 수 있습니다.

+0

멋지다, slebetman! 그래서 (1) 변수 할당과 변이를 최대한 피하고 대신 함수 인수를 사용하고 (2) 함수 반복을 위해 루프를 회피하는 것처럼 보이면 기능 패턴을 발견하게 될 것입니다. –

+0

그건 내 궁극적 인 목표입니다 - 땜질이가 하향식 학습 대신에 'currying'과 'function composition'과 같은 패턴의 상향식 학습을 유도하고 적용하는 상황을 만듭니다. –

+0

기능적 프로그래머가 * 변수 *가 금지되지만 * 부작용 *이 금지된다는 것은 아닙니다. 귀하의 예제에서'var a = [1, 2, 3]'은 완벽하게 괜찮으며, 여러 번 사용할 값에 이름을 부여하는 편리한 방법입니다. (이것은 하스켈에서 'let'표현식으로 꽤 직접 표현할 수있어 하스켈에 변수가 없다는 주장을 복잡하게 만든다.) – Ben

2

큰 질문입니다.

John Hughes가 작성한이 고전적인 (그리고 멋진) 논문 - Why Functional Programming Matters을 자세히 읽어보십시오.

먼저 휴즈는 이 아닌이 무엇인지 설명하고 FP의 제안자가 사용하는 약한 주장을 인용합니다. 좋은 물건 (그러나 여기에서 인용하기에는 너무나 길다).

둘째, 휴즈는 FP에 대해 무엇인지 설명 :

그것은 지금 일반적으로 모듈 형 설계가 성공적인 프로그래밍의 열쇠임을 인정하고, 같은 모듈라 II [6] 에이다와 같은 최근의 언어 [5] 모듈성을 향상시킬 수 있도록 특별히 설계된 기능을 포함하십시오. 그러나 종종 놓친 매우 중요한 포인트가 있습니다. 문제를 해결하기 위해 모듈 식 프로그램을 작성할 때 먼저 문제를 하위 문제로 나눈 다음 하위 문제를 해결하고 마지막으로 솔루션을 결합합니다. 원래 문제를 나눌 수있는 방법은 솔루션을 함께 붙일 수있는 방법에 직접 의존합니다. 따라서 문제를 개념적으로 모듈화하는 능력을 높이려면 프로그래밍 언어에서 새로운 종류의 접착제를 제공해야합니다. 복잡한 범위 규칙 및 별도 컴파일을위한 조항은 세부적인 내용에만 도움이됩니다. 모듈화에 큰 기여를 할 수는 없습니다.

우리는이 글의 나머지 부분에서 함수형 언어가 두 가지 매우 중요한 종류의 접착제를 제공한다고 주장합니다. 새로운 방식으로 모듈화 될 수있는 프로그램의 몇 가지 예를 제시하고이를 단순화 할 수 있습니다. 이것은 함수형 프로그래밍의 핵심입니다. 모듈화가 개선되었습니다. 기능성 프로그래머가 노력해야하는 목표이기도합니다 - 더 작고 단순하며보다 일반적인 모듈을 우리가 설명 할 새로운 접착제로 함께 붙이십시오.

(강조 광산)

그래서 자바 스크립트에서 FP을하기 위해, 다시 원래의 질문에 도착, 당신은 그들을 함께 접착 한 후, 별도의 모듈을 구현하여 프로그램을 빌드 할 수 있습니다. Javascript는 좋은 접착제와 함께 제공되며, 더 많은 접착제를 직접 만들 수 있습니다 - combinators을 확인하십시오.

당신은 예를 들어, 코드의 모듈 형 조각을 결합하는 접착제를 사용하지 못하도록하는 기능을 피하려고한다 :

  • 변경 가능 상태 - 당신은 할 수 없습니다 - 그것은 글로벌
  • 문이다 특히 당신이 변수에 +를 할당 할 수 없습니다 또는 인수
로 전달 - 함수 인수 등 운영자 또는 속성 액세스와 같은 구문의
  • 몇 가지 종류로 while -loops 통과

    (이러한 문제는 물론 어느 정도 완화 될 수 있습니다. 예를 들어 Javascript FP 라이브러리를 확인하십시오.)

    반면에 클래스, 객체, 상속, 프로토 타입 등- 반드시 Javascript의 접착제를 사용하지 못하도록하지 마십시오. 따라서 FP를 사용하지 않을 이유가 없습니다.

  • 관련 문제