미쳐버리겠다. 함수형 사고방식이 머리속에 막 비집고 들어오려고 하는데 머리가 터져버릴 거 같네.
참고글을 맘대로 번역하면서 공부.
포인트 프리 프로그래밍은. 불필요한 인자-매개변수 맵핑으로 인해 발생하는 시각적 어수선함을 정리하려는 것이다.
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()
는 의도를 드러내는 이름이지만 포인트-프리 하지는 않음.
문제 다루기 : 큰 문제를 작은 조각으로 분해. 다시 조립
큰 작업 다루기 : 작은 함수로 분해, 초기 문제를 해결하도록 작은 함수 조립.
//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://divyanshu013.dev/blog/point-free-programming-and-composition/