함수형 사고, 양도하라

함수형 사고, 양도하라

해당 게시글은 Functional Thinking 함수형 사고 를 읽고 공부한 내용을 정리한 것입니다.

저작권 문제가 발생할 시 해당 글은 삭제됩니다 :<

이전 글은 함수형 사고, 전환에서 보실 수 있습니다.

  • 사용하는 추상화 단계보다 한 단계 아래를 이해해야 한다

클로저

  • 그 내부에서 참조되는 모든 인수에 대한 묵시적 바인딩을 지닌 함수
  • 자신이 참조하는 모든 문맥을 포함한다
    • 내부에서 정의되었지만 코드 블록이 인수에 바인딩되어 있다
    • 상수와 같이 변하지 않는 값을 바인딩하는 것이 보편적
    • 코드 블록이 존재하는 동안 이 인수 값은 유지
  • 클로저 인스턴스는 생성될 때 스코프 내에 있던 모든 것을 캡슐화하여 유지
    • 런타임에 내부 상태 관리를 맡김
      • *언어로 하여금 상태를 관리하게 한다
  • 클로저 블록에 코드를 바인딩하면 그 블록의 실행을 나중으로 연기할 수 있다

명령형 언어와 뭐가 다른가?

  • 명령형 언어는 상태로 프로그래밍 모델을 만드는 반면
  • 클로저는 코드와 문맥을 캡슐화해 행위의 모델을 만들게 한다

커링과 부분 적용

커링

  • 다인수 함수를 일인수 함수들의 체인으로 바꿔주는 것
  • 변형의 과정이지 변형된 함수 실행을 지칭하진 않음
  • 함수 호출자가 몇 개의 인수를 고정할지 결정해, 적은 수의 인수를 지닌 함수를 유도한다
  • 체인의 다음 함수 리턴
1
2
3
4
5
6
7
8
9
// 예시
process(x, y, z)

// 완전 커링된 버전
process(x)(y)(z)

process(x)
// 실행하면 x를 인자로 가진 함수가 다른 함수를 리턴
// 리턴된 함수에 인자로 y를 넘기는 식

부분적용

  • 다인수 함수를 생략된 인수의 값을 미리 정해서 더 적은 수의 인수를 받는 하나의 함수로 변형하는 함수
  • 몇몇 인수에 값을 적용하되, 적용되지 않은 나머지 인수만 받는 함수 리턴
  • 인수가 적은 함수를 만들어준다
1
2
3
4
5
// 예시
process(x, y, z)

// 실행
process(x, y)

예시들

함수 팩토리

함수가 객체를 반환하는 경우

1
2
3
4
5
6
7
function createJelly() {
return {
type: 'jelly',
colour: 'red'
scoops: 3
};
}

출처 : 자바스크립트에서 팩토리 함수란 무엇인가

템플릿 메서드 패턴

  • 객체를 생성하는 작업도 복잡하고 어렵거나 특정한 절차를 따라야 할 경우 이를 대행하는 함수를 두는 설계 방식
  • 객체를 생성하되 직접 객체 생성자를 호출해서 객체를 생성하는 것이 아니라 대행함수를 통해 간접적으로 객체를 생성하는 방식
  • 이 때 객체 생성을 대행해주는 함수가 함수 팩토리

출처 : Factory Method(팩토리 메서드) 패턴 with C++

묵시적 값

재귀

  • 누가 상태를 관리하는가가 중요 질문

    • 명령형 버전에서는 개발자
    • 함수형에서는 언어가

    재귀는 상태 관리를 런타임에 양도한다

꼬리 호출 최적화

재귀에 최적화되지 않은 언어는 스택 오버플로를 유발하게 된다. 개발자가 런타임이 이 문제를 처리하는데 도움을 줄 수 있는 방법 중 하나가 꼬리 호출 최적화이다.

재귀 호출이 함수에서 마지막 단계이면 스택을 증가시키지 않고 스택에 놓인 결과를 교체할 수 있다.

다음 글은 함수형 사고, 열심히보다는 현명하게에서 보실 수 있습니다.