기능 프로그래머가 되길 원합니다 (6 부)

기능 프로그래밍 개념을 이해하기위한 첫 번째 단계를 취하는 것이 가장 중요하고 때로는 가장 어려운 단계입니다. 하지만 꼭 그럴 필요는 없습니다. 올바른 관점이 아닙니다.

이전 부품 : 1 부, 2 부, 3 부, 4 부, 5 부

이제 뭐?

이 위대한 새로운 것들을 모두 배웠으니, 아마도“지금 무엇? 일상적인 프로그래밍에서 이것을 어떻게 사용할 수 있습니까?”

따라 다릅니다. Elm 또는 Haskell과 같은 순수 기능 언어로 프로그래밍 할 수 있다면 이러한 아이디어를 모두 활용할 수 있습니다. 이러한 언어를 사용하면 쉽게 할 수 있습니다.

우리 중 많은 사람들이 자바 스크립트와 같은 명령형 언어로만 프로그래밍 할 수 있다면, 배운 것을 많이 사용할 수 있지만 더 많은 훈련이 필요할 것입니다.

기능성 자바 스크립트

Javascript에는보다 기능적인 방식으로 프로그래밍 할 수있는 많은 기능이 있습니다. 순수하지는 않지만 언어를 사용하거나 라이브러리를 사용하면 더 많은 불변성을 얻을 수 있습니다.

이상적이지는 않지만 사용해야 할 경우 기능 언어의 이점을 얻을 수있는 이유는 무엇입니까?

불변성

가장 먼저 고려해야 할 것은 불변성입니다. ES2015 또는 ES6에는 const라는 새로운 키워드가 있습니다. 이는 변수가 설정되면 재설정 할 수 없음을 의미합니다.

const a = 1;
a = 2; // Chrome, Firefox 또는 노드에서 TypeError가 발생합니다.
       // 사파리에는 없지만 (2016 년 10 월경)

여기서 a는 상수로 정의되므로 한 번 설정하면 변경할 수 없습니다. 그렇기 때문에 a = 2에서 예외가 발생합니다 (Safari 제외).

Javascript에서 const의 문제는 충분히 멀지 않다는 것입니다. 다음 예제는 한계를 보여줍니다.

const a = {
    x : 1,
    y : 2
};
a.x = 2; // 예외 없음!
a = {}; // 이것은 TypeError를 던질 것이다

a.x = 2가 어떻게 예외를 던지지 않는지 주목하십시오. const 키워드로 변경할 수없는 유일한 것은 변수 a입니다. 가리킬 수있는 모든 것.

Javascript를 훨씬 더 좋게 만들었 기 때문에 이것은 매우 실망입니다.

Javascript에서 어떻게 불변성을 얻는가?

불행히도 Immutable.js라는 라이브러리를 통해서만 가능합니다. 이것은 우리에게 더 나은 불변성을 줄 수 있지만 슬프게도 코드가 Javascript보다 Java처럼 보이도록 만듭니다.

카레와 구성

이 시리즈의 앞부분에서 우리는 커리 기능을 작성하는 방법을 배웠습니다. 보다 복잡한 예는 다음과 같습니다.

const f = a => b => c => d => a + b + c + d

카레 부분을 직접 작성해야합니다.

그리고 f를 호출하려면 다음과 같이 작성해야합니다.

console.log (f (1) (2) (3) (4)); // 10을 인쇄합니다

그러나 Lisp 프로그래머를 울리기에 충분한 괄호입니다.

이 프로세스를 더 쉽게 만드는 많은 라이브러리가 있습니다. 내가 가장 좋아하는 것은 Ramda입니다.

Ramda를 사용하여 다음과 같이 작성할 수 있습니다.

const f = R.curry ((a, b, c, d) => a + b + c + d);
console.log (f (1, 2, 3, 4)); // 10을 인쇄합니다
console.log (f (1, 2) (3, 4)); // 10을 인쇄합니다
console.log (f (1) (2) (3, 4)); // 10을 인쇄합니다

함수 정의는 그다지 좋지 않지만 모든 괄호가 필요하지 않습니다. f를 호출 할 때마다 원하는만큼 매개 변수를 적용 할 수 있습니다. f.

Ramda를 사용하면 3 부와 4 부에서 mult5AfterAdd10 함수를 다시 작성할 수 있습니다.

const add = R.curry ((x, y) => x + y);
const mult5 = 값 => 값 * 5;
const mult5AfterAdd10 = R.compose (mult5, add (10));

Ramda에는 이러한 종류의 작업을 수행하는 데 도움이되는 많은 도우미 기능이 있습니다. R.add와 R.multiply는 더 적은 코드를 작성할 수 있음을 의미합니다.

const mult5AfterAdd10 = R.compose (R.multiply (5), R.add (10));

맵, 필터링 및 축소

Ramda에는 자체 버전의 맵, 필터링 및 축소 기능도 있습니다. 이러한 함수는 vanilla Javascript의 Array.prototype에 존재하지만 Ramda의 버전은 다음과 같이 커리됩니다.

const isOdd = R.flip (R.modulo) (2);
const onlyOdd = R.filter (isOdd);
const isEven = R.complement (isOdd);
const onlyEven = R.filter (isEven);
const 번호 = [1, 2, 3, 4, 5, 6, 7, 8];
console.log (onlyEven (숫자)); // 인쇄합니다 [2, 4, 6, 8]
console.log (onlyOdd (숫자)); // [1, 3, 5, 7]을 인쇄합니다

R.modulo는 2 개의 매개 변수를 취합니다. 첫 번째는 배당 (분할되는 것)이고 두 번째는 제수 (분할하는 것)입니다.

isOdd 함수는 나머지를 2로 나눈 나머지입니다. 나머지 0은 홀수가 아닌 허위이고 나머지 1은 진실이며 홀수입니다. 우리는 모듈로의 첫 번째와 두 번째 매개 변수를 뒤집어 2를 제수로 지정할 수 있습니다.

isEven 함수는 isOdd의 보완 일뿐입니다.

onlyOdd 함수는 술어 (부울을 리턴하는 함수)가 isOdd 인 필터 함수입니다. 실행하기 전에 숫자 목록, 최종 매개 변수를 기다리고 있습니다.

onlyEven 함수는 isEven을 조건 자로 사용하는 필터입니다.

isEven 및 onlyOdd에 숫자를 전달하면 isEven 및 isOdd는 최종 매개 변수를 가져 와서 최종적으로 기대 한 숫자를 반환하도록 실행할 수 있습니다.

자바 스크립트 단점

지금까지 Javascript를 도입 한 모든 라이브러리 및 언어 향상 기능으로 인해 모든 사람에게 모든 것을 제공하려는 명령 언어라는 사실로 여전히 고통 받고 있습니다.

대부분의 프론트 엔드 개발자는 브라우저에서 오랫동안 자바 스크립트 만 사용했기 때문에 자바 스크립트를 사용하고 있습니다. 그러나 많은 개발자들이 현재 Javascript를 직접 작성하는 것에서 멀어지고 있습니다.

대신, 그들은 다른 언어로 쓰고 더 정확하게는 자바 스크립트로 컴파일하고 있습니다.

CoffeeScript는 이러한 언어 중 첫 번째 언어 중 하나였습니다. 이제 Typescript는 Angular 2에서 채택되었습니다. Babel은 Javascript의 트랜스 필러로 간주 될 수도 있습니다.

점점 더 많은 사람들이 생산에서이 접근 방식을 취하고 있습니다.

그러나 이러한 언어는 Javascript로 시작하여 약간 향상되었습니다. 순수 기능 언어에서 자바 스크립트로 완전히 전환하지 않겠습니까?

느릅 나무

이 시리즈에서는 함수형 프로그래밍에 대한 이해를 돕기 위해 Elm을 살펴 보았습니다.

그러나 엘름은 무엇입니까? 어떻게 사용할 수 있습니까?

Elm은 Javascript로 컴파일되는 순수 기능 언어이므로이를 사용하여 TEA (이 아키텍처는 Redux 개발자에게 영감을 준) 인 Elm Architecture를 사용하여 웹 애플리케이션을 작성할 수 있습니다.

Elm 프로그램에는 런타임 오류가 없습니다.

Elm은 NoRedInk와 같은 회사에서 생산에 사용되고 있으며 Elm의 창시자 인 Evan Czapliki는 현재 Prez에서 근무했습니다.

자세한 내용은 NoRedInk의 Richard Feldman과 Elm 전도사가 작성한 6 개월의 생산 과정에서 Elm의이 대화를 참조하십시오.

모든 Javascript를 Elm으로 바꿔야합니까?

아니요. 부품을 점차적으로 교체 할 수 있습니다. 자세한 내용은이 블로그 항목 (직장에서 Elm을 사용하는 방법)을 참조하십시오.

왜 엘름을 배우는가?

  1. 순수 기능 언어로 프로그래밍하는 것은 제한적이며 자유 롭습니다. 모든 Elm 프로그램이 기능적으로 반응하는 모델 인 Elm Architecture를 따르기 때문에 수행 할 수있는 작업 (주로 발에 몸을 쏘지 않도록함으로써)을 제한하지만 동시에 버그와 잘못된 디자인 결정에서 벗어날 수 있습니다.
  2. 함수형 프로그래밍은 더 나은 프로그래머가 될 것입니다. 이 기사의 아이디어는 빙산의 일각 일뿐입니다. 프로그램의 크기가 줄어들고 안정성이 어떻게 향상되는지 실제로 이해하려면 실제로 그것들을 볼 필요가 있습니다.
  3. Javascript는 처음에 10 일 만에 구축 된 후 지난 20 년간 패치되어 다소 기능적이고 다소 객체 지향적이며 완전한 명령형 프로그래밍 언어가되었습니다.
    Elm은 Haskell 커뮤니티에서 지난 30 년 동안 배운 것을 사용하여 설계되었으며 수십 년 동안 수학 및 컴퓨터 과학 분야에서 일한 것입니다.
    TEA (Elm Architecture)는 수년에 걸쳐 설계되고 개선되었으며, Functional Reactive Programming에 대한 Evan의 논문의 결과입니다. 시간과 공간 제어를보고이 디자인의 공식화에 대한 사고 수준을 평가하십시오.
  4. Elm은 프론트 엔드 웹 개발자를 위해 설계되었습니다. 삶을 더 편하게 만드는 것을 목표로합니다. 이 목표를 더 잘 이해하려면 주류가 되십시오.

미래

미래가 어떻게 될지 알 수는 없지만, 우리는 교육적인 추측을 할 수 있습니다. 여기 내 것이 있습니다 :

Javascript로 컴파일되는 언어로 분명하게 이동할 것입니다.
현재 소프트웨어 복잡성 문제를 해결하기 위해 40 년 이상 사용 된 기능적 프로그래밍 아이디어가 다시 발견 될 것입니다.
하드웨어 상태 (예 : 기가 바이트의 저렴한 메모리와 빠른 프로세서는 기능적 기술을 가능하게합니다.
CPU는 더 빨라지지 않지만 코어 수는 계속 증가합니다.
가변 상태는 복잡한 시스템에서 가장 큰 문제 중 하나로 인식됩니다.

나는 함수형 프로그래밍이 미래라고 믿고 지난 몇 년 동안 그것을 배우기 위해 고군분투했기 때문에이 시리즈의 기사를 썼다 (나는 아직도 배우고있다).

저의 목표는 다른 사람들이 제가하는 것보다 쉽고 빠르게 이러한 개념을 배우도록 도와주고 다른 사람들이 더 나은 프로그래머가되어 미래에 더 많은 직업을 가질 수 있도록 돕는 것입니다.

Elm이 미래에 거대한 언어가 될 것이라는 나의 예측이 잘못 되었더라도, Functional Programming과 Elm이 미래가 무엇이든간에 궤도에 올 것이라고 확신 할 수 있습니다.

이 시리즈를 읽은 후에는 이러한 개념에 대한 자신의 능력과 이해에 대해 더 자신감을 갖기를 바랍니다.

앞으로의 노력에 행운이 있기를 바랍니다.

이것을 좋아한다면 아래의 을 클릭하면 다른 사람들이 이것을 Medium에서 볼 수 있습니다.

Elm에서 Functional Programming을 사용하여 서로 배우고 웹 앱을 개발하도록 돕는 웹 개발자 커뮤니티에 참여하려면 내 Facebook 그룹을 확인하십시오. Elm Programming 알아보기 https://www.facebook.com/groups/learnelm/

내 트위터 : @cscalfani