함수형 프로그래밍과 point-free 컴포지션

Felix Yi·2020년 5월 15일
1

미쳐버리겠다. 함수형 사고방식이 머리속에 막 비집고 들어오려고 하는데 머리가 터져버릴 거 같네.

참고글을 맘대로 번역하면서 공부.

포인트 프리 프로그래밍은. 불필요한 인자-매개변수 맵핑으로 인해 발생하는 시각적 어수선함을 정리하려는 것이다.

간단한 포인트 프리

const add1 = n => n + 1;

[1, 2, 3].map(n => add1(n)); // [2, 3, 4]

// A point free variant - unnecessary parameter eliminated
[1, 2, 3].map(add1); // [2, 3, 4]
const add = (a, b) => a + b;

[1, 2, 3].map(curry(add)(1)); // [2, 3, 4]

add(1)로 부분적용된 함수가 나오고.. 1,2,3 이 인자로 순회.

포인트 프리 유틸

리스트 수행에서 포인트-프리

아래와 같은 책 배열 정보가 있다고 하자.

let authors = {
	"1" : { name : "Author C"},
  "2" : { name : "Author B"},
  "3" : { name : "Author A"}
}

let books = [
  { 
    id : 1,
    type : "T",
    title : "Book1",
    authorID : 1
  },
  { 
    id : 2,
    type : "T",
    title : "Book2",
    authorID : 2
  },
  { 
    id : 3,
    type : "R",
    title : "Book3",
    authorID : 3
  }
];

책을 가져오는데 다음 행위를 해야다고 치자.
1. 타입이 T 인 책을 골라내기
2. 보여주는에 필요한 모든 정보를 준비
3. 저자 이름을 정렬

isTechnology(), toBookView(), ascByAuthor()는 의도를 드러내는 이름이지만 포인트-프리 하지는 않음.

분해와 합성

문제 다루기 : 큰 문제를 작은 조각으로 분해. 다시 조립
큰 작업 다루기 : 작은 함수로 분해, 초기 문제를 해결하도록 작은 함수 조립.

  • 타입이 T 인 책을 골라내기
  • 보여주는에 필요한 모든 정보를 준비
  • 저자 이름을 정렬

//Callbacks with points
function getBooksUsingPoints(){
	return books.filter(book => isTechnology(book))
              .map(book => toBookView(book))
              .sort((book1,book2) => ascByAuthor(book1, book2));
}

console.log(getBooksUsingPoints());

//Point-free callbacks
function getBooks(){
	return books.filter(isTechnology)
              .map(toBookView)
              .sort(ascByAuthor);
}
console.log(getBooks());

//Pure functions with points
function isTechnology(book){
   return book.type === "T";
}

function toBookView(book){
  return Object.freeze({
    title : book.title,
    author : authors[book.authorID].name
  });
}
  
function ascByAuthor(book1, book2){
  if(book1.author < book2.author) return -1;
  if(book1.author > book2.author) return 1;
  return 0;
}

포인트 프리 합성을 향한 첫발

포인트프리 합성하면 추가적인 익명함수 콜백없다. function 키워드, 화살표 함수도 없다. 오직 함수 이름만 볼 수 있다.

  • 대부분의 경우 콜백을 이름있는 함수로 추출
  • 간단한 경우에는 즉시 콜백을 생성하는 유틸리티 함수를 사용.
  • (여러작업)조정함수를 포인트-프리 스타일로 작성

작은 함수

이런식의 코드 작성의 결과는 의도가 드러나는 이름을 가진 많은 수의 작은 함수들이다. 이 작은 함수들을 이름짓는 건 시간이 걸린다, 그러나 잘 끝났다면, 코드를 좀 더 읽기 쉽게 만들 것이다.

함수는 다음 두 종류가 있다:

  • 작업 하나만 하는 함수: 그들은 순수 혹은 클로저 함수다.
    보통은 포인트-프리 스타일이 아니다, 좋은 이름을 가진다.
  • 많은 작업을 조정하는 함수: 작은 작업들을 포인트 프리 스타일로 합치는 게 읽기 편하게 해준다.

참고

https://www.freecodecamp.org/news/how-point-free-composition-will-make-you-a-better-functional-programmer-33dcb910303a/

https://divyanshu013.dev/blog/point-free-programming-and-composition/

profile
다른 누구와도 같은 시장 육체 노동자

0개의 댓글