일급함수란 : 함수를 다른 변수와 동일하게 다룰 수 있을떄 일급함수라고 표현합니다.
https://developer.mozilla.org/ko/docs/Glossary/First-class_Function
고계함수란 : 함수가 다른 함수를 인수로 받는 것을 말합니다. Higher Order Function
let a = [0, 1, 2, 3]
a.map(item => item + 2)
console.log(a) // [2, 3, 4, 5]
반면
절차적 또는 명령형 프로그래밍
은 어떤 결과를 내기위해 시스템의 상태를 변경하는 구문을 위에서 아래로 늘어놓습니다.let a = [0, 1, 2, 3] for (let i = 0; i < a.length; i++) { a[i] = a + 2 } console.log(a) // [2, 3, 4, 5]
함수형 프로그래밍은 무상태성과 불변성을 지향합니다. 즉, 상태를 두지 않으려면 순수함수여야 합니다.
위 두개의 조건을 만족시키지 않으면 불순하다고 할 수 있습니다.
Date.now()
는 같은 입력에 다른 결과가 나올수 있으므로 순수함수가 아닙니다.
let counter = 0
const add1 = () => counter++
위 함수는 동일한 입력에 다른 결과를 냅니다. 순수함수가 아닙니다. 즉, 참조 투명하지 않은 함수 입니다.
const add = counter => counter++
위 함수는 동일한 입력에 동일한 결과를 나타냅니다. 순수함수입니다.
이러한 순수함수는 치환성을 극대화 시켜줍니다. 이러한 치환성이 모듈성을 높여줍니다.
let input = [1, 2, 3]
// divide, size, sum 등의 함수는 순수함수라고 하자
let average = arr => divide(sum(arr), size(arr))
average(input) // 2
let average = arr => divide(6, 3)
average(input) // 2
let a = [1, 2, 3]
let b = a.filter(item => item > 1)
.map(item => item + 1)
.reduce((a, b) => a + b, 0)