abonglog logoabonglog

함수형 자바스크립트 프로그래밍 학습 커리큘럼 의 썸네일

함수형 자바스크립트 프로그래밍 학습 커리큘럼

함수형 자바스크립트

프로필 이미지
yonghyeun

본 게시글은 geminedeep research 기능을 이용해 함수형 자바스크립트 프로그래밍 학습 커리큘럼을 조사해오라고 한 후 편집한 글입니다.

함수형 자바스크립트 프로그래밍 학습 커리큘럼

서론: 함수형 프로그래밍으로의 여정

함수형 프로그래밍(Functional Programming)은 데이터를 처리하는 방식을 수학적 함수의 계산으로 간주하고, 프로그램의 상태와 변경 가능한 데이터를 멀리하는 프로그래밍 패러다임의 하나입니다 [1].

이는 명령형 프로그래밍과는 대조적으로, 프로그램의 실행 과정을 상태 변화의 연속으로 보는 대신, 입력에 대한 출력을 생성하는 함수의 응용을 강조합니다[4]. 함수형 프로그래밍은 작은 '순수 함수'들을 마치 블록처럼 쌓아 올려 프로그램의 로직을 구현하는 방식을 취합니다[4].

자바스크립트는 함수를 특별한 지위로 취급하는 언어입니다. 함수가 마치 일반적인 값처럼 변수에 할당될 수 있고, 다른 함수의 인자로 전달될 수 있으며, 심지어 다른 함수에서 반환될 수도 있습니다 [3].

이러한 특징 덕분에 자바스크립트는 객체 지향 프로그래밍뿐만 아니라 함수형 프로그래밍을 위한 강력한 기반을 제공하며, 많은 개발자들이 객체 지향 방식보다는 함수형 프로그래밍 방식을 선호하는 경향이 있습니다[4].

더욱이, 최신 자바스크립트 환경은 함수형 프로그래밍을 지원하는 다양한 기능들을 내장하고 있으며, 이를 활용하여 개발자들은 더욱 효율적이고 간결한 코드를 작성할 수 있습니다 [3]. 함수형 프로그래밍은 데이터 불변성을 강조하여 병렬 처리에 유리하며, 부수 효과를 최소화하여 코드의 버그 발생 가능성을 줄이고 유지보수를 용이하게 합니다 [5].

이 커리큘럼은 함수형 프로그래밍의 기본적인 개념부터 고급 기법에 이르기까지 체계적으로 학습할 수 있도록 설계되었습니다. 각 단계별 학습 목표를 명확히 제시하고, 이론적인 설명과 함께 실제 자바스크립트 코드를 통한 실습을 병행하여 학습 효과를 극대화하는 것을 목표로 합니다. 이 여정을 통해 학습자는 함수형 프로그래밍의 핵심 원리를 이해하고, 자바스크립트에서 이를 효과적으로 활용하여 더욱 강력하고 안정적인 소프트웨어를 개발할 수 있는 능력을 갖추게 될 것입니다.

1단계: 함수형 프로그래밍의 기본 개념 이해

함수형 프로그래밍의 핵심 원리

함수형 프로그래밍은 몇 가지 핵심 원리를 기반으로 합니다. 그중 하나가 순수 함수(Pure Function) 의 개념입니다. 순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 함수 외부의 어떤 상태도 변경하지 않는 함수를 의미합니다 [3]. 다시 말해, 순수 함수는 부수 효과(side effect)가 없는 함수만을 사용하여 프로그램을 구성합니다. 이러한 순수성은 코드의 예측 가능성을 높이고, 테스트와 디버깅을 용이하게 만듭니다.

또 다른 중요한 원리는 불변성(Immutability) 입니다. 불변성은 데이터가 생성된 이후에는 그 값을 변경할 수 없다는 원칙입니다 [3]. 함수형 프로그래밍에서는 변수나 객체와 같은 데이터가 한번 정의되면 수정되지 않으며, 데이터에 변경이 필요할 때는 원본 데이터를 복사하여 새로운 데이터를 생성합니다. 이러한 불변성은 프로그램 실행 중에 상태 변화를 예측 가능하게 만들어 코드의 안정성을 높입니다.

일급 함수(First-Class Function) 는 함수형 프로그래밍의 또 다른 중요한 특징입니다. 이는 함수를 마치 일반적인 값처럼 취급할 수 있다는 의미로, 함수를 변수에 할당하거나, 다른 함수의 인수로 전달하거나, 다른 함수에서 결과로 반환할 수 있습니다 [3]. 자바스크립트에서는 함수가 이러한 일급 객체로 취급됩니다 [3].

고차 함수(Higher-Order Function) 는 다른 함수를 인수로 받거나, 함수를 결과로 반환하는 함수를 말합니다 5. 자바스크립트에서는 배열의 map, filter, reduce 메서드 등이 대표적인 고차 함수입니다 [14]. 고차 함수는 코드의 추상화 수준을 높이고 재사용성을 향상시키는 데 중요한 역할을 합니다.
마지막으로, 함수형 프로그래밍은 선언형 프로그래밍(Declarative Programming) 패러다임의 일종입니다. 선언형 프로그래밍은 프로그램이 '무엇(What)'을 해야 하는지를 설명하는 데 중점을 두며, '어떻게(How)' 해야 하는지에 대한 구체적인 절차를 명시하지 않습니다 4. 이는 명령형 프로그래밍이 프로그램의 실행 단계를 명시적으로 기술하는 것과 대조됩니다.

함수형 프로그래밍의 핵심 원리들은 프로그램의 안정성, 예측 가능성, 그리고 유지보수성을 높이는 데 기여합니다. 순수 함수와 불변성은 부수 효과를 최소화하고 상태 변화를 관리하여 코드의 신뢰성을 향상시키며, 일급 함수와 고차 함수는 코드의 추상화와 재사용성을 용이하게 합니다.

명령형 프로그래밍과의 비교

함수형 프로그래밍은 명령형 프로그래밍과는 여러 면에서 뚜렷한 차이를 보입니다. 명령형 프로그래밍은 프로그램의 상태를 변경하는 일련의 명령들을 순차적으로 실행하는 데 중점을 두는 반면 [4], 함수형 프로그래밍은 입력 값을 받아 출력 값을 생성하는 함수의 평가를 중심으로 이루어집니다 [4]. 명령형 프로그래밍은 주로 '어떻게' 작업을 수행할지에 집중하는 반면 [18], 함수형 프로그래밍은 '무엇'을 계산할지에 더 관심을 가집니다 [18].

명령형 프로그래밍에서는 변수를 사용하여 프로그램의 상태를 저장하고 변경하는 것이 일반적입니다 [2]. 반면, 함수형 프로그래밍은 불변성을 지향하므로, 변수의 값을 변경하는 대신 새로운 값을 생성합니다 [2]. 예를 들어, 명령형 방식에서는 배열에 요소를 추가할 때 기존 배열을 직접 수정할 수 있지만, 함수형 방식에서는 원본 배열을 복사하여 새로운 요소가 추가된 새 배열을 생성합니다.

명령형 프로그래밍의 예시로, 외부 변수인 count를 직접 수정하는 increase 함수는 실행 시점과 횟수에 따라 결과가 달라지므로 액션으로 분류됩니다 [7]. 함수형 프로그래밍에서는 액션과 계산을 명확히 분리하여 액션을 최소화하고 순수한 계산 함수를 많이 만들어 관리하는 것을 목표로 합니다 [7].

레고 공장을 비유로 설명하면, 명령형 공장은 원료에 색소를 넣고 틀로 찍고 굳히는 '어떻게'에 집중하는
반면, 함수형 공장은 단순히 '빨간 4x4 레고 블록'이라는 '무엇'에 집중합니다 [21]. 이는 선언형 방식이 명령형 방식을 추상화한 결과이며, 함수형 프로그래밍은 명령형 프로그래밍에 비해 코드 길이가 줄어들고, 부수 효과가 없어 내부에서 고려해야 할 변수가 줄어들어 특정 입력에 대해 항상 동일한 출력을 생성할 수 있다는 장점을 보여줍니다 [21].

자바스크립트 코드에서도 명령형 방식은 for 루프나 if/else 문을 사용하여 상태를 직접 변경하는 방식으로 나타나는 반면 [24], 함수형 방식은 map, filter, reduce와 같은 메서드를 사용하여 데이터의 변환 과정을 선언적으로 표현합니다 [25]. 함수형 프로그래밍은 실행 흐름을 명시적으로 선언하는 대신, 각 단계에서 기대하는 결과를 명시함으로써 코드를 더 간결하고 가독성이 높게 만듭니다 [25].

함수형 프로그래밍의 주요 장점

함수형 프로그래밍은 여러 가지 중요한 장점을 제공합니다.

첫째, 순수 함수의 사용은 코드의 가독성을 향상시키고, 각 함수가 독립적으로 작동하므로 유지보수를 용이하게 만듭니다 [3].

둘째, 부수 효과를 최소화함으로써 버그 발생 가능성을 줄이고 디버깅을 더 쉽게 만듭니다 [5]. 순수 함수는 외부 상태에 의존하지 않기 때문에, 입력이 같다면 항상 같은 출력을 보장하므로 예측 가능성이 높습니다.

셋째, 함수형 프로그래밍에서 강조하는 데이터 불변성은 여러 작업을 동시에 처리하는 병렬 처리 환경에서 안전성을 높여줍니다 [5]. 데이터가 변경되지 않으므로, 여러 스레드가 동시에 데이터에 접근해도 상태가 손상될 위험이 줄어듭니다.

넷째, 함수형 프로그래밍은 높은 수준의 추상화를 가능하게 하며, 고차 함수를 통해 코드의 재사용성을 증대시킵니다 [15]. 함수를 값처럼 다루고 조합함으로써, 더 복잡한 기능을 간결하게 구현할 수 있습니다.

다섯째, 순수 함수는 외부 상태에 영향을 미치지 않으므로 테스트가 용이합니다 [26]. 각 함수를 독립적으로 테스트할 수 있으며, 특정 입력에 대한 예상 출력을 쉽게 확인할 수 있습니다. 또한, 함수형 프로그래밍은 프로그램의 논리를 수학적 함수처럼 다루기 때문에, 코드의 정확성을 증명하고 오류 발생 가능성을 줄이는 데 유리합니다.

함수형 프로그래밍은 대규모 시스템 개발 시 코드의 가독성을 높이고, 오류를 줄이며, 테스트와 유지 보수를 용이하게 하여 개발 생산성을 향상시키고 코드 품질을 개선하는 데 기여합니다 [3]. 이러한 장점들은 복잡한 소프트웨어 시스템을 더 효과적으로 관리하고 개발하는 데 중요한 역할을 합니다.

2단계: 자바스크립트에서 함수의 역할

자바스크립트에서 함수는 일급 객체

자바스크립트에서 함수가 일급 객체(First-Class Citizen) 로 취급된다는 것은 해당 언어의 함수가 다른 변수와 마찬가지로 취급된다는 의미입니다. 이는 함수가 변수에 값으로 저장될 수 있고, 다른 함수의 인수로 전달될 수 있으며, 다른 함수에서 반환될 수도 있다는 것을 의미합니다 [3]. 또한, 함수는 배열, 큐 또는 스택과 같은 자료 구조에 저장될 수도 있으며 [6], 자체적인 메서드와 속성을 가질 수도 있습니다 [6].

예를 들어, 다음과 같이 함수를 변수에 할당할 수 있습니다 [12]

함수를 변수에 할당
const greet = function(name) {
  return "Hello, " + name;
};
 
const sayHello = greet;
console.log(sayHello("World")); // 출력: Hello, World

또한, 함수를 다른 함수의 인수로 전달할 수 있습니다 [13]:

함수를 다른 함수의 인자로 전달
function wishHappyNewYear(personName) {
  return 'Happy New Year, ' + personName + '!';
}
 
function greetPerson(greetingFunction, name) {
  return greetingFunction(name);
}
 
console.log(greetPerson(wishHappyNewYear, 'John Doe')); // 출력: Happy New Year, John Doe!

뿐만 아니라, 함수에서 다른 함수를 반환하는 것도 가능합니다 [13]:

함수에서 다른 함수를 반환
function createMultiplier(factor) {
  return function(number) {
    return number * factor;
  };
}
 
const multiplyByFive = createMultiplier(5);
console.log(multiplyByFive(10)); // 출력: 50

이처럼 자바스크립트에서 함수를 일급 객체로 취급하는 특징은 함수형 프로그래밍의 기본적인 토대를 마련하며, 함수를 데이터처럼 유연하게 다룰 수 있도록 합니다. 이는 함수를 조합하고 추상화하는 함수형 프로그래밍의 핵심 원리를 구현하는 데 매우 유리합니다.

고차 함수: 개념 및 활용

고차 함수(Higher-Order Function) 는 다른 함수를 인수로 받거나, 함수를 결과로 반환하는 함수를 말합니다 [5]. 자바스크립트에는 이미 많은 유용한 고차 함수들이 내장되어 있습니다. 배열의 메서드인 map(), filter(), reduce(), forEach(), find(), some(), every() 등이 대표적인 예시입니다 [14].
map() 메서드는 배열의 각 요소에 대해 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환합니다. 예를 들어, 숫자 배열의 각 요소를 제곱한 새로운 배열을 만들 수 있습니다 [17]

자바스크립트의 고차함수 사용 예시
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map(function(number) {
  return number * number;
});
console.log(squaredNumbers); // 출력: [1, 4, 6, 7, 8]
 
const numbers = [1, 2, 3, 4, 5];
const evenNumbers = numbers.filter(function(number) {
  return number % 2 === 0;
});
console.log(evenNumbers); // 출력: [2, 4]
 
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce(function(accumulator, currentValue) {
  return accumulator + currentValue;
}, 0);
console.log(sum); // 출력: 15

고차 함수는 이처럼 코드를 더 간결하고 선언적으로 만들어주며, 반복적인 로직을 추상화하여 코드의 재사용성을 높입니다 [16]. 또한, 함수 합성, 커링, 메모이제이션과 같은 고급 함수형 프로그래밍 기법을 구현하는 데에도 필수적인 역할을 합니다 [16].

코드 예시: 일급 함수 및 고차 함수 활용

일급 함수 활용 예시:

일급 함수 및 고차함수 활용
// 함수를 변수에 할당
const operation = (a, b, func) => func(a, b);
const add = (a, b) => a + b;
const subtract = (a, b) => a - b;
 
console.log(operation(5, 3, add)); // 출력: 8
console.log(operation(5, 3, subtract)); // 출력: 2
 
// 함수를 인수로 전달하는 고차 함수
function applyOperation(func, x) {
  return func(x);
}
 
const square = x => x * x;
console.log(applyOperation(square, 4)); // 출력: 16
 
// 함수를 반환하는 고차 함수
function createGreeting(greeting) {
  return function(name) {
    return greeting + ", " + name + "!";
  };
}
 
const sayHello = createGreeting("Hello");
console.log(sayHello("Alice")); // 출력: Hello, Alice!

3단계: 불변성과 클로저의 이해

클로저: 개념과 자바스크립트에서의 활용

클로저(Closure) 는 함수와 해당 함수가 선언될 당시 주변 상태(렉시컬 환경)에 대한 참조를 묶은 조합입니다 [11]. 다시 말해, 내부 함수가 외부 함수의 스코프에 있는 변수들에 접근할 수 있도록 해주는 메커니즘입니다. 외부 함수의 실행이 종료된 후에도 내부 함수는 이 변수들에 접근할 수 있는데, 이는 내부 함수가 외부 함수의 변수들을 '기억'하기 때문입니다 [29]. 자바스크립트에서는 함수가 생성될 때마다 클로저가 생성됩니다 [29].
다음은 클로저의 간단한 예시입니다 [29]:

클로저 예시
function outerFunction() {
  let outerVariable = 'I am from the outer function';
 
  function innerFunction() {
    console.log(outerVariable); // innerFunction은 outerVariable에 접근 가능
  }
 
  return innerFunction;
}
 
const closureExample = outerFunction();
closureExample(); // 출력: I am from the outer function

위 코드에서 innerFunction은 outerFunction 내에서 정의되었지만, outerFunction이 실행된 후에도 outerVariable에 접근할 수 있습니다. 이는 innerFunction이 outerFunction의 스코프를 기억하는 클로저이기 때문입니다.

클로저는 다양한 상황에서 유용하게 활용됩니다 [33]. 데이터 캡슐화와 private 변수를 흉내 내는 데 사용될 수 있으며 [33], 함수의 호출 사이에 상태를 유지하는 데에도 활용됩니다 [33]. 또한, 이벤트 핸들러나 콜백 함수 내에서 외부 스코프의 변수에 접근해야 할 때 클로저가 필수적입니다 [34]. 함수형 프로그래밍에서는 클로저를 이용하여 커링과 같은 고급 기법을 구현하기도 합니다 [37].

불변성: 중요성 및 자바스크립트에서의 구현

불변성(Immutability) 은 함수형 프로그래밍의 핵심 가치 중 하나로, 한번 생성된 데이터는 그 내용을 변경할 수 없다는 개념입니다 [3]. 자바스크립트에서 원시 타입(number, string, boolean, null, undefined, symbol, bigint)은 불변성을 가집니다. 하지만 객체와 배열은 기본적으로 가변(mutable)입니다 [40].

불변성을 유지하는 것은 여러 가지 중요한 이점을 제공합니다 [39]. 먼저, 코드의 예측 가능성을 향상시킵니다. 데이터가 변경되지 않으므로, 프로그램의 어느 시점에서든 데이터의 상태를 신뢰할 수 있습니다. 둘째, 부수 효과를 줄여 코드의 안정성을 높이고 디버깅을 용이하게 합니다. 셋째, 데이터가 변경되지 않는다는 보장 덕분에 병렬 처리 환경에서 안전하게 데이터를 공유할 수 있습니다. 넷째, 데이터 변경을 추적하고 관리하는 것이 더 쉬워지므로, 상태 관리 라이브러리(예: Redux)에서 효율적인 변경 감지를 가능하게 합니다 [41].

자바스크립트에서 불변성을 구현하는 방법은 여러 가지가 있습니다 [44]. const 키워드를 사용하여 변수의 재할당을 막을 수 있지만, 객체 내부의 속성까지 불변으로 만들지는 못합니다 [40]. Object.freeze() 메서드를 사용하면 객체를 동결하여 새로운 속성 추가, 기존 속성 제거 또는 변경을 방지할 수 있습니다 [46]. 하지만 Object.freeze()는 얕은 동결만 수행하므로, 객체 내부에 있는 객체나 배열은 여전히 변경 가능합니다 [46].

스프레드 연산자(...)나 Object.assign() 메서드를 사용하여 객체나 배열을 복사하고, 필요한 변경 사항을 적용한 새로운 객체나 배열을 생성하는 방법도 있습니다 [40] 이는 원본 데이터를 변경하지 않고 새로운 데이터를 만들어 불변성을 유지하는 데 유용합니다.

더욱 강력한 불변성 관리를 위해 Immutable.js 42나 Immer 44와 같은 라이브러리를 사용할 수도 있습니다. Immutable.js는 List, Map, Set 등 다양한 불변 자료 구조를 제공하며, Immer는 가변적인 방식으로 코드를 작성하면서 불변성을 유지하도록 도와줍니다.
코드 예시: 클로저와 불변성 구현
클로저 구현 예시:

클로저를 이용한 코드 예시
// 카운터를 생성하는 함수
function createCounter() {
  let count = 0; // 외부 함수의 지역 변수
 
  // 내부 함수 (클로저)
  return {
    increment: function() {
      count++;
    },
    getCount: function() {
      return count;
    }
  };
}
 
const counter = createCounter();
counter.increment();
counter.increment();
console.log(counter.getCount()); // 출력: 2 (count 변수는 외부 함수의 실행이 끝났음에도 유지됨)
불변성을 활용한 코드 예시
// Object.freeze()를 사용한 불변 객체 생성
const immutableObject = Object.freeze({ name: 'Alice', age: 30 });
// immutableObject.age = 31; // 오류 발생 (strict mode에서)
console.log(immutableObject.age); // 출력: 30
 
// 스프레드 연산자를 사용한 불변 객체 업데이트
const person = { name: 'Bob', age: 25 };
const updatedPerson = { ...person, age: 26 };
console.log(person.age); // 출력: 25 (원본 객체는 변경되지 않음)
console.log(updatedPerson.age); // 출력: 26

4단계: 핵심 함수형 프로그래밍 기법 익히기

커링: 개념 및 자바스크립트 구현

커링(Currying) 은 여러 개의 인수를 받는 함수를 단일 인수를 받는 여러 개의 함수로 변환하는 기술입니다 [11]. 즉, 원래 함수 f(a, b, c)를 커링하면 f(a)(b)(c)와 같이 순차적으로 인수를 전달하는 형태로 호출할 수 있게 됩니다. 커링은 클로저를 이용하여 구현됩니다 [37]. 외부 함수가 첫 번째 인수를 받고 내부 함수를 반환하며, 이 내부 함수는 두 번째 인수를 받고 또 다른 내부 함수를 반환하는 방식으로 계속됩니다. 모든 인수가 제공되면 가장 안쪽의 함수가 원래의 연산을 수행하고 결과를 반환합니다.
다음은 자바스크립트에서 커링을 구현하는 간단한 예시입니다 [37]:

커링 예시
function sum(a) {
  return function(b) {
    return function(c) {
      return a + b + c;
    };
  };
}
 
console.log(sum(1)(2)(3)); // 출력: 6
 
const sum1 = sum(1);
const sum2 = sum1(2);
const result = sum2(3);
console.log(result); // 출력: 6

커링은 코드의 재사용성을 향상시키고 [37], 함수의 인수를 부분적으로 적용하여 새로운 함수를 쉽게 생성할 수 있도록 합니다 [37]. 예를 들어, 특정 값을 미리 설정해둔 함수를 만들 수 있습니다.

커링을 이용해 값을 클로저로 기억하는 코드 예시
function multiply(a) {
  return function(b) {
    return a * b;
  };
}
 
const multiplyByFive = multiply(5);
console.log(multiplyByFive(3)); // 출력: 15
console.log(multiplyByFive(10)); // 출력: 50

함수 합성: 이해 및 실제 코드 적용

함수 합성(Function Composition) 은 두 개 이상의 함수를 결합하여 새로운 함수를 만드는 과정입니다 11. 이는 마치 데이터를 처리하는 여러 개의 파이프라인을 연결하는 것과 유사하며, 한 함수의 출력이 다음 함수의 입력으로 전달됩니다. 일반적으로 함수 합성은 f(g(x))와 같은 형태로 표현되며, 이는 오른쪽에서 왼쪽으로, 즉 g가 먼저 실행되고 그 결과가 f에 전달되는 순서로 평가됩니다 [51].

자바스크립트에서는 함수 합성을 위해 composepipe라는 고차 함수를 자주 사용합니다 [51]. compose 함수는 전달된 함수들을 오른쪽에서 왼쪽으로 실행하는 새로운 함수를 반환하는 반면, pipe 함수는 왼쪽에서 오른쪽으로 실행합니다. pipe는 우리가 일반적으로 코드를 읽는 순서와 일치하므로 더 직관적일 수 있습니다 [51].

다음은 compose 함수를 직접 구현한 예시입니다 [53]:

compoese 함수 구현
const compose = (...functions) => {
  return (input) => {
    return functions.reduceRight((acc, fn) => {
      return fn(acc);
    }, input);
  };
};

그리고 pipe 함수는 다음과 같이 구현할 수 있습니다 [55]:

pipe 함수 구현
const pipe = (...functions) => {
  return (input) => {
    return functions.reduce((acc, fn) => {
      return fn(acc);
    }, input);
  };
};

함수 합성을 사용하면 복잡한 데이터 처리 로직을 더 작고 재사용 가능한 함수들의 조합으로 표현할 수 있어 코드의 가독성과 유지보수성을 향상시킵니다 [55]. 또한, 임시 변수의 사용을 줄이고 코드를 더 선언적으로 만들 수 있습니다 [51]. 함수 합성은 함수형 프로그래밍에서 매우 중요한 개념이며, 다양한 라이브러리에서 편리하게 사용할 수 있도록 제공됩니다.

커링 적용 예시
const curry = (fn) => {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    } else {
      return function(...moreArgs) {
        return curried.apply(this, args.concat(moreArgs));
      };
    }
  };
};
 
const add = (a, b, c) => a + b + c;
const curriedAdd = curry(add);
 
console.log(curriedAdd(1)(2)(3)); // 출력: 6
console.log(curriedAdd(1, 2)(3)); // 출력: 6
console.log(curriedAdd(1)(2, 3)); // 출력: 6
const toUpperCase = str => str.toUpperCase();
const addExclamation = str => str + '!';
const reverseString = str => str.split('').reverse().join('');
 
// compose 사용
const composedFunction = compose(addExclamation, toUpperCase, reverseString);
console.log(composedFunction("hello")); // 출력: !OLLEH
 
// pipe 사용
const pipedFunction = pipe(reverseString, toUpperCase, addExclamation);
console.log(pipedFunction("hello")); // 출력: OLLEH!

5단계: 고급 함수형 프로그래밍 개념 탐구

모나드: 개념 소개 및 자바스크립트 활용

모나드(Monad) 는 함수형 프로그래밍에서 계산 과정을 일련의 단계로 구조화하는 방법으로 11, 각 단계는 값을 생성할 뿐만 아니라 잠재적인 실패, 비결정성, 부수 효과와 같은 계산에 대한 추가 정보를 처리합니다 56. 모나드는 타입 생성자 M과 두 가지 연산인 return (값을 모나드 컨텍스트로 올림)과 bind (모나드 연산을 연결)를 갖습니다 [56]. 모나드는 특정 시나리오에 따라 값에 대한 무제한 접근이 부적절한 경우에 사용될 수 있습니다 [56].

자바스크립트에서 모나드를 직접 구현하는 것은 다소 복잡할 수 있지만, 그 개념을 이해하는 것은 함수형 프로그래밍을 더 깊이 있게 이해하는 데 도움이 됩니다. 모나드는 부수 효과를 안전하고 예측 가능하게 처리하고, 복잡한 계산 흐름을 추상화하는 데 사용되는 강력한 패턴입니다 [57].

Maybe 모나드, Either 모나드 등

Maybe 모나드는 값이 존재할 수도 있고 존재하지 않을 수도 있는 경우를 처리하는 데 사용됩니다 56. 이는 일반적으로 Just (값이 있음)와 Nothing (값이 없음) 두 가지 서브타입으로 표현됩니다 [62]. Maybe 모나드를 사용하면 값이 없는 경우에 발생할 수 있는 오류를 방지하고, 연산을 안전하게 건너뛸 수 있습니다.

Either 모나드는 성공 또는 실패를 명시적으로 처리하는 데 사용됩니다 [65]. 이는 Right (성공적인 값)와 Left (실패에 대한 정보) 두 가지 서브타입으로 표현됩니다 [65]. Either 모나드를 사용하면 실패 시 구체적인 오류 정보를 담아 처리할 수 있어, Maybe 모나드보다 더 자세한 오류 처리가 가능합니다.
이 외에도 Identity 모나드, IO 모나드, State 모나드 등 다양한 종류의 모나드가 존재하며, 각각 특정 프로그래밍 문제들을 함수형 방식으로 해결하기 위한 추상적인 도구를 제공합니다 [59].
코드 예시: 간단한 모나드 구현 및 활용
Maybe 모나드 구현 예시:

Maybe 모나드 구현 예시
class Maybe {
  constructor(value) {
    this.value = value;
  }
 
  static of(value) {
    return new Maybe(value);
  }
 
  isNothing() {
    return this.value === null |
| this.value === undefined;
  }
 
  map(fn) {
    return this.isNothing() ? this : Maybe.of(fn(this.value));
  }
 
  flatMap(fn) {
    return this.isNothing() ? this : fn(this.value);
  }
 
  getOrElse(defaultValue) {
    return this.isNothing() ? defaultValue : this.value;
  }
}
 
const justValue = Maybe.of(5);
const nothingValue = Maybe.of(null);
 
console.log(justValue.map(x => x * 2).getOrElse(0)); // 출력: 10
console.log(nothingValue.map(x => x * 2).getOrElse(0)); // 출력: 0

Either 모나드 구현 예시:

Either 모나드 구현 예시
 
class Either {
  constructor(value) {
    this.value = value;
  }
}
 
class Left extends Either {
  isLeft() { return true; }
  isRight() { return false; }
  map(fn) { return this; }
  flatMap(fn) { return this; }
  getOrElse(defaultValue) { return defaultValue; }
}
 
class Right extends Either {
  isLeft() { return false; }
  isRight() { return true; }
  map(fn) { return Right.of(fn(this.value)); }
  flatMap(fn) { return fn(this.value); }
  getOrElse(defaultValue) { return this.value; }
}
 
Either.Left = (value) => new Left(value);
Either.Right = (value) => new Right(value);
Either.of = Either.Right;
 
function parseJSON(json) {
  try {
    return Either.Right(JSON.parse(json));
  } catch (e) {
    return Either.Left(e);
  }
}
 
const validJSON = '{"name": "Alice", "age": 30}';
const invalidJSON = '{"name": "Bob", "age": }';
 
console.log(parseJSON(validJSON).map(obj => obj.name).getOrElse("Error")); // 출력: Alice
console.log(parseJSON(invalidJSON).map(obj => obj.name).getOrElse("Error")); // 출력: Error

6단계: 함수형 프로그래밍 라이브러리 활용

Lodash/FP: 특징 및 사용법

Lodash/FP는 인기 있는 유틸리티 라이브러리인 Lodash의 함수형 프로그래밍 스타일을 강화한 모듈입니다 [67]. Lodash/FP의 주요 특징은 다음과 같습니다 [67]

  • 불변성(Immutable): Lodash/FP의 모든 함수는 원본 데이터를 변경하지 않고 새로운 데이터를 반환합니다.
  • 자동 커링(Auto-curried): 모든 함수가 자동으로 커링되어 필요한 인수를 순차적으로 적용할 수 있습니다.
  • 데이터 마지막(Data-last): 대부분의 함수에서 처리할 데이터가 마지막 인자로 전달되어 함수 합성을 용이하게 합니다.
  • 고정된 Arity: 모든 함수는 고정된 수의 인수를 받도록 설계되어 커링을 지원합니다.
    Lodash/FP는 map, filter, reduce, pick, omit, merge 등 다양한 함수를 제공하여 배열, 객체, 문자열 등 다양한 데이터 타입을 함수형 방식으로 처리할 수 있도록 돕습니다 67. 예를 들어, 다음과 같이 Lodash/FP를 사용하여 배열의 각 요소를 1씩 증가시킬 수 있습니다 68:
Loadsh/FP 예시
const fp = require('lodash/fp');
const numbers = [1, 2, 3];
const addOne = fp.map(n => n + 1);
console.log(addOne(numbers)); // 출력: [2, 3, 4]

Ramda: 주요 기능 및 철학

Ramda는 순수한 함수형 프로그래밍 스타일을 지향하는 자바스크립트 유틸리티 라이브러리입니다 [70]. Ramda의 주요 기능 및 철학은 다음과 같습니다 [70]

  • 순수한 함수형 스타일 강조: 불변성과 부작용 없는 함수를 설계 철학의 핵심으로 여깁니다.
  • 자동 커링: 모든 함수가 자동으로 커링되어 부분 적용 및 함수 합성을 용이하게 합니다.
    데이터 마지막 인자: 처리할 데이터가 대부분의 함수에서 마지막 인자로 전달되어 함수 파이프라인을 쉽게 구성할 수 있습니다.
  • 값 동일성 비교: 객체나 배열의 동등성을 비교할 때 참조가 아닌 값을 기준으로 판단합니다 [75].
  • 함수 합성 지원: compose와 pipe 함수를 통해 함수들을 쉽게 결합하여 새로운 함수를 만들 수 있습니다 [73].
    Ramda는 map, filter, reduce, compose, pipe, curry, prop, equals 등 다양한 함수를 제공하며, 함수형 프로그래밍 패러다임을 따르는 코드를 간결하고 표현력 있게 작성할 수 있도록 지원합니다 73. 예를 들어, Ramda를 사용하여 객체의 특정 속성 값을 추출하고 대문자로 변환하는 함수를 다음과 같이 작성할 수 있습니다 [78]:
Ramda 예시
const R = require('ramda');
const users =;
const getNameUpperCase = R.pipe(R.prop('name'), R.toUpper);
const upperCaseNames = R.map(getNameUpperCase, users);
console.log(upperCaseNames); // 출력:

7단계: 실제 프로젝트에 함수형 자바스크립트 적용

함수형 자바스크립트가 사용된 예시 코드 및 프로젝트 분석

함수형 프로그래밍은 다양한 실제 시나리오에서 효과적으로 활용될 수 있습니다 [87]. 예를 들어, 온라인 쇼핑 카트에서 만료된 상품을 필터링하거나, 소셜 미디어 피드에서 사용자 이름을 사용자 프로필에 매핑하는 작업 등에 함수형 기법을 적용할 수 있습니다 [87]. 작업 관리 앱에서 보류 중인 작업 수를 계산하거나, 이메일 클라이언트에서 이메일 템플릿을 구성하는 것도 함수형 프로그래밍의 좋은 활용 예시입니다 [87].

UI 개발에서도 함수형 프로그래밍은 강력한 도구가 될 수 있습니다. 함수 합성을 이용하여 재사용 가능한 UI 컴포넌트를 생성하고, 데이터 흐름을 명확하게 관리할 수 있습니다 [88]. 예를 들어, HTML 태그를 생성하는 함수들을 조합하여 복잡한 UI 구조를 간결하게 표현할 수 있습니다 [88].

Ramda와 같은 함수형 라이브러리는 실제 프로젝트에서 데이터 처리 및 변환 작업을 효율적으로 수행하는 데 도움을 줍니다[78]. 조건부 로직을 if-else 대신 cond 함수로 표현하거나, 에러 처리를 try-catch 대신 tryCatch 함수로 추상화하여 코드의 가독성을 높일 수 있습니다 [79]. 또한, 함수형 프로그래밍은 불변성을 강조하므로, 상태 관리가 중요한 애플리케이션에서 데이터의 변화를 예측하고 관리하는 데 유리합니다.

학습한 내용을 바탕으로 간단한 프로젝트 직접 구현 가이드

함수형 자바스크립트 학습 내용을 바탕으로 간단한 프로젝트를 직접 구현해보는 것은 이해도를 높이고 실력을 향상시키는 데 매우 효과적입니다. 프로젝트를 시작하기 전에 먼저 프로젝트의 목표와 주요 기능을 명확하게 정의해야 합니다. 예를 들어, "간단한 계산기" 프로젝트라면 사칙연산 기능을 목표로 설정할 수 있습니다.

다음으로, 프로젝트에 필요한 함수들을 설계합니다. 각 함수는 순수 함수로 작성하는 것을 목표로 하며, 특정 입력에 대해 항상 동일한 출력을 반환하고 외부 상태를 변경하지 않도록 주의해야 합니다. 예를 들어, 계산기 프로젝트의 덧셈 기능은 두 숫자를 입력받아 그 합을 반환하는 순수 함수로 설계할 수 있습니다.

코드를 구현할 때는 함수형 프로그래밍 원칙을 적극적으로 적용합니다. 데이터는 불변으로 취급하고, 상태 변화는 새로운 데이터를 생성하는 방식으로 처리합니다. 고차 함수를 활용하여 반복적인 로직을 추상화하고, 함수 합성을 통해 여러 기능을 조합하여 더 복잡한 기능을 구현합니다.

구현이 완료되면 꼼꼼한 테스트를 통해 코드의 정확성을 확인하고, 필요한 경우 디버깅 과정을 거칩니다. 작은 기능부터 시작하여 점진적으로 기능을 확장해나가는 것이 좋습니다.

프로젝트 아이디어 제시

초보자를 위한 함수형 자바스크립트 프로젝트 아이디어로는 다음과 같은 것들이 있습니다 [89]:
  • 간단한 계산기: 두 수의 사칙연산을 수행하는 웹 페이지를 만들어 봅니다.
  • 할 일 목록: 항목 추가, 삭제, 완료 표시 기능을 갖춘 할 일 목록 애플리케이션을 개발합니다.
  • 색상 팔레트 생성기: 사용자가 지정한 색상 규칙에 따라 다양한 색상 조합을 생성하는 도구를 만듭니다.
  • 주사위 굴리기 시뮬레이터: 버튼 클릭 시 임의의 주사위 눈금을 표시하고 결과를 기록하는 웹 페이지를 구현합니다.
중급자를 위한 프로젝트 아이디어는 다음과 같습니다 [90]:
  • API 연동을 통한 데이터 표시: 공공 API(예: 날씨 정보, 뉴스)를 호출하여 데이터를 가져와 웹 페이지에 표시하는 애플리케이션을 개발합니다.
  • 간단한 게임 로직 구현: 틱택토, 숫자 야구와 같은 간단한 게임의 로직을 함수형 방식으로 구현합니다.
  • 마크다운 미리보기: 마크다운 텍스트를 입력하면 HTML로 변환하여 미리보기를 보여주는 웹 페이지를 만듭니다.

8단계: 지속적인 학습을 위한 자료 확보

함수형 자바스크립트 학습에 도움이 될 만한 온라인 강의

함수형 자바스크립트 프로그래밍을 체계적으로 학습하는 데 도움이 되는 온라인 강의들이 많이 있습니다 [94].

Frontend Masters는 "Functional JavaScript Learning Path"를 통해 초급부터 고급까지 다양한 수준의 함수형 자바스크립트 강의를 제공합니다 [94]. 이 과정은 핵심 개념부터 실제 적용까지 폭넓게 다루며, 학습자가 깊이 있는 이해를 얻을 수 있도록 돕습니다.

egghead.io에서는 "Professor Frisby Introduces Composable Functional JavaScript" 강의를 통해 함수형 프로그래밍의 기본적인 개념과 함수 합성에 대해 학습할 수 있습니다.

Learn Rx는 Microsoft의 Reactive Extensions (Rx) 라이브러리를 JavaScript에서 사용하는 방법을 가르치는 대화형 튜토리얼 시리즈입니다 95. RxJS는 비동기 및 이벤트 기반 프로그래밍을 함수형 스타일로 처리하는 데 매우 유용한 라이브러리입니다.

유용한 튜토리얼 및 블로그 글

온라인 강의 외에도 다양한 튜토리얼과 블로그 글들이 함수형 자바스크립트 학습에 도움을 줄 수 있습니다 [97]. Hackernoon의 "Functional Programming with JavaScript" 시리즈 [97]는 함수형 프로그래밍의 핵심 원리와 실제 적용 사례를 자세히 설명합니다.

Medium의 "A Functional JavaScript Stack 2019" 104는 함수형 자바스크립트 개발 스택과 관련된 다양한 자료들을 소개합니다. GitHub의 "Functional-Light JavaScript" [98]는 Kyle Simpson이 작성한 자료로, 함수형 프로그래밍의 가벼운 접근 방식을 제시합니다. 그 외에도 다양한 블로그에서 함수형 자바스크립트 관련 팁과 테크닉을 얻을 수 있습니다 [100].

추천 도서 목록

함수형 자바스크립트 프로그래밍에 대한 깊이 있는 이해를 돕는 책들도 좋은 학습 자료입니다 [98]. "JavaScript Allongé" 는 함수형 프로그래밍의 핵심 개념을 심도 있게 다루는 책으로, 많은 개발자들에게 추천받고 있습니다 [98]. "Professor Frisby's Mostly Adequate Guide to Functional Programming" 은 온라인에서 무료로 제공되는 자료로, 함수형 프로그래밍의 기초를 튼튼하게 다질 수 있도록 돕습니다 [98]. "Learning JavaScript Design Patterns""Pure React" 와 같은 책들도 함수형 프로그래밍의 개념을 실제 자바스크립트 개발에 적용하는 방법을 이해하는 데 도움이 될 수 있습니다 [101].

결론: 함수형 자바스크립트 전문가로 성장하기

이 커리큘럼을 통해 함수형 프로그래밍의 핵심 개념부터 고급 기법, 그리고 실제 프로젝트 적용까지 학습하는 여정을 안내했습니다. 함수형 프로그래밍은 수학적 사고에 기반한 자료 처리 방식이며, 순수 함수, 불변성, 일급 함수, 고차 함수와 같은 핵심 원리를 통해 코드의 안정성, 가독성, 재사용성을 높이는 강력한 패러다임입니다. 자바스크립트의 유연한 특성은 이러한 함수형 프로그래밍 원칙을 적용하는 데 매우 적합하며, Lodash/FP, Ramda, Sanctuary와 같은 라이브러리는 함수형 프로그래밍을 더욱 쉽고 효율적으로 활용할 수 있도록 지원합니다.

지속적인 학습과 실습은 함수형 자바스크립트 전문가로 성장하는 데 필수적입니다. 학습한 내용을 바탕으로 간단한 프로젝트부터 시작하여 점진적으로 복잡한 프로젝트에 함수형 기법을 적용해보고, 다양한 온라인 강의, 튜토리얼, 블로그 글, 책 등을 통해 꾸준히 지식을 확장해나가야 합니다. 또한, 함수형 프로그래밍 관련 커뮤니티에 참여하여 다른 개발자들과 정보를 교류하고 경험을 공유하는 것도 좋은 방법입니다. 끊임없는 노력과 탐구를 통해 학습자는 함수형 자바스크립트 프로그래밍 능력을 숙달하고, 더 나아가 소프트웨어 개발 분야에서 전문가로 성장할 수 있을 것입니다.

출처

  1. hyojabal.tistory.com, accessed March 26, 2025, https://hyojabal.tistory.com/41#:~:text=%ED%95%A8%EC%88%98%ED%98%95%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D(functional%20programming)%EC%9D%80
  2. 함수형 프로그래밍 입문 - Jaemin Hong, accessed March 26, 2025
  3. 함수형 프로그래밍이란 무엇인가? - 실용적 접근으로 이해하기 - F-Lab, accessed March 26, 2025
  4. 선언형 VS 함수형 프로그래밍 | 주니어 백엔드 개발자 인터뷰, accessed March 26, 2025
  5. 함수형 프로그래밍이란 무엇이고, 왜 사용할까? - velog, accessed March 26, 2025
  6. What is the first class function in JavaScript ? - GeeksforGeeks, accessed March 26, 2025
  7. 다시 쓰는 함수형 프로그래밍 - velog, accessed March 26, 2025
  8. JavaScript: Functional & Imperative — map, filter & reduce | by Jack Harvey | ClearScore, accessed March 26, 2025
  9. Functions - JavaScript - MDN Web Docs, accessed March 26, 2025
  10. Java 8 에서 왜 함수형 프로그래밍이 도입되었을까? - Tecoble, accessed March 26, 2025
  11. 함수형 프로그래밍 기초 개념 - 티스토리, accessed March 26, 2025
  12. What are First Class Functions in JavaScript? | Scaler Topics, accessed March 26, 2025
  13. Difference between First-Class and Higher-Order Functions in JavaScript - GeeksforGeeks, accessed March 26, 2025
  14. Learn JavaScript: Higher Order Functions and Iterators - Codecademy, accessed March 26, 2025
  15. 함수형 프로그래밍이 중요한 이유, accessed March 26, 2025
  16. JavaScript Higher Order Functions - GeeksforGeeks, accessed March 26, 2025
  17. Mastering JavaScript: Higher-Order Functions | by Vinay Chhabra | Medium, accessed March 26, 2025
  18. Declarative vs imperative - DEV Community, accessed March 26, 2025
  19. Functional Programming Vs Declarative Programming Vs Imperative Programming - Stack Overflow, accessed March 26, 2025
  20. Functional programming vs. imperative programming - LINQ to XML - .NET - Learn Microsoft, accessed March 26, 2025
  21. [프로그래밍 언어론] 프로그래밍 패러다임 (명령형 - 절차지향, 객체 ..., accessed March 26, 2025
  22. 함수형 프로그래밍 - 나무위키, accessed March 26, 2025
  23. [프로그래밍] 함수형 프로그래밍(Functional Programming) 이란? - 망나니개발자 - 티스토리, accessed March 26, 2025
  24. Functional vs. Imperative Programming - Blog | retzdev, accessed March 26, 2025
  25. Functional programming in JavaScript | RST Software, accessed March 26, 2025
  26. 함수형 프로그래밍과 명령형 프로그래밍 비교 - LINQ to XML - .NET - Learn Microsoft, accessed March 26, 2025
  27. (번역) 어쨌든 함수형 프로그래밍의 장점은 뭔가요? - 한정(Han Jung), accessed March 26, 2025
  28. Higher-Order Functions :: Eloquent JavaScript, accessed March 26, 2025
  29. Closures - JavaScript | MDN - MDN Web Docs - Mozilla, accessed March 26, 2025
  30. JavaScript Closures: A Guide | Built In, accessed March 26, 2025
  31. Closure in JavaScript - GeeksforGeeks, accessed March 26, 2025
  32. Intro to JavaScript closures - Ivo Culic - Medium, accessed March 26, 2025
  33. 10 use cases of closures in JavaScript | Tech Tonic - Medium, accessed March 26, 2025
  34. Good examples for using a Closure in Javascript - Stack Overflow, accessed March 26, 2025
  35. Closure & Common Use Cases - DEV Community, accessed March 26, 2025
  36. Practical usecases of Closures in JavaScript - Kodaschool, accessed March 26, 2025
  37. Currying in JavaScript Explained with Examples | Built In, accessed March 26, 2025
  38. Currying - The Modern JavaScript Tutorial, accessed March 26, 2025
  39. Immutable - MDN Web Docs Glossary: Definitions of Web-related terms, accessed March 26, 2025
  40. Immutability in JavaScript - Telerik.com, accessed March 26, 2025
  41. Understanding Immutability in JavaScript - CSS-Tricks, accessed March 26, 2025
  42. Immutable.js, accessed March 26, 2025
  43. Why is Immutability so Important in JavaScript? - GeeksforGeeks, accessed March 26, 2025
  44. codedamn.com, accessed March 26, 2025, https://codedamn.com/news/javascript/immutability-in-javascript#:~:text=You%20can%20achieve%20immutability%20in
  45. Immutability in JavaScript: Why It's Important and How to Achieve It, accessed March 26, 2025
  46. Create immutable object in javascript - Stack Overflow, accessed March 26, 2025
  47. How to Preserve Immutability of Objects in JavaScript ..., accessed March 26, 2025
  48. How to Make Your JavaScript Code Immutable, accessed March 26, 2025
  49. Making Curry: JavaScript Functional Programming - DEV Community, accessed March 26, 2025
  50. What is Currying Function in JavaScript? - GeeksforGeeks, accessed March 26, 2025
  51. Master the JavaScript Interview: What is Function Composition? | by ..., accessed March 26, 2025
  52. Unlocking the Power of Function Composition: JavaScript Made ..., accessed March 26, 2025
  53. Function Composition in JavaScript: Exploring the Power of compose | by Akhil Anand, accessed March 26, 2025
  54. Understand JavaScript Composition Once and for All | Stackademic, accessed March 26, 2025
  55. A Quick Introduction to pipe() and compose() in JavaScript - GeeksforGeeks, accessed March 26, 2025
  56. Monad (functional programming) - Wikipedia, accessed March 26, 2025
  57. What Is a Monad in Functional Programming? - Built In, accessed March 26, 2025
  58. A gentle introduction to monads - Kristof Slechten - Medium, accessed March 26, 2025
  59. Explained in 5 minutes: Monads in plain JavaScript | by Piotr Jaworski - Medium, accessed March 26, 2025
  60. Monads for functional programming - The University of Edinburgh, accessed March 26, 2025
  61. JavaScript Monads Made Simple - Medium, accessed March 26, 2025
  62. Nest.JS | Monads -> Maybe. The Maybe monad, also known as the ..., accessed March 26, 2025
  63. functional programming - Maybe monad sample code in javascript ..., accessed March 26, 2025
  64. Advanced functional programming in TypeScript: Maybe monad ..., accessed March 26, 2025
  65. Practical Intro to Monads in JavaScript: Either — Evojam, accessed March 26, 2025
  66. Building Expressive Monads in Javascript: Introduction - DEV Community, accessed March 26, 2025
  67. FP Guide · lodash/lodash Wiki · GitHub, accessed March 26, 2025
  68. Functional Programming with Lodash/FP - The Miners - Codeminer42 Blog, accessed March 26, 2025
  69. Lodash Documentation, accessed March 26, 2025
  70. Ramda Documentation, accessed March 26, 2025
  71. Ramda Documentation, accessed March 26, 2025
  72. Ramda Documentation, accessed March 26, 2025
  73. Learning about Ramda.js - Medium, accessed March 26, 2025
  74. 0.25.0 - Ramda Documentation, accessed March 26, 2025
  75. Differences between Lodash and Ramda - Stack Overflow, accessed March 26, 2025
  76. JavaScript Utility Libraries. Comparison of JS, Ramda, and Lodash | by Jolene Langlinais, accessed March 26, 2025
  77. Functional Programming vs. Vanilla Javascript - FBRS, accessed March 26, 2025
  78. 7 Ramda recipes - czyzykowski.com, accessed March 26, 2025
  79. RamdaJS: Using it for the first time - DEV Community, accessed March 26, 2025
  80. zhentian-wan/ramda-demo: Example collections for ramda.js - GitHub, accessed March 26, 2025
  81. Use ramdajs for iterative calculations - Stack Overflow, accessed March 26, 2025
  82. ramda/ramda: :ram: Practical functional Javascript - GitHub, accessed March 26, 2025
  83. Sanctuary - JS.ORG, accessed March 26, 2025
  84. Sanctuary - Refuge from unsafe JavaScript - Interview with David Chambers - SurviveJS, accessed March 26, 2025
  85. Try Either Functor Example Sanctuary - StackBlitz, accessed March 26, 2025
  86. sanctuary-js-example - Codesandbox, accessed March 26, 2025
  87. Functional Programming in JavaScript: 10 Scenarios Demystified - DEV Community, accessed March 26, 2025
  88. Functional JavaScript: Function Composition For Every Day Use. | by Joel Thoms - Medium, accessed March 26, 2025
  89. 100 js projects, accessed March 26, 2025
  90. JavaScript Projects | 80+ Project Ideas with Source Code for 2025 - GeeksforGeeks, accessed March 26, 2025
  91. 21 Easy JavaScript Projects for Beginners (Code included!) - Skillcrush, accessed March 26, 2025
  92. 19 Simple JavaScript Projects for Beginners [Updated for 2024] - Boot.dev Blog, accessed March 26, 2025
  93. Top 9 Beginner JavaScript Practice Projects (Yes, Code Included!) | Zero To Mastery, accessed March 26, 2025
  94. Functional JavaScript Learning Path - Power Up Your JavaScript ..., accessed March 26, 2025
  95. Functional Programming in Javascript - ReactiveX, accessed March 26, 2025
  96. Chapter 6 Functional programming - Learn Enough to Be Dangerous, accessed March 26, 2025
  97. Functional Programming With JavaScript: A Deep Dive | HackerNoon, accessed March 26, 2025
  98. The Best Book on Functional Programming for JS I've Read. : r ..., accessed March 26, 2025
  99. JavaScript Tutorial for Beginners | Learn Functional Programming with JavaScript ES6+, accessed March 26, 2025
  100. Functional JavaScript Part 1: Lists - Jeremy Fairbank Blog, accessed March 26, 2025
  101. 15 Blogs Every Javascript Developer Should Follow in 2022 - Pluralsight, accessed March 26, 2025
  102. The Best JavaScript Blogs - Draft.dev, accessed March 26, 2025
  103. Deep Dive into Functional Programming in Javascript - DEV Community, accessed March 26, 2025
  104. A functional Javascript stack (2019) | by David Komer | Medium, accessed March 26, 2025