pipe('some_data', A, B, C, D)
export interface UserEntity {
id: number;
gender: 'F' | 'M';
name: string;
}
export function getUsers(): UserEntity[] {
return [
{
id: 1,
gender: 'F',
name: 'jane park',
},
{
id: 2,
gender: 'M',
name: 'ivan kim',
},
{ id: 10, gender: 'F', name: 'oll lee' },
];
}
const firstNames = pipe(
getUsers(),
A.map((data) => data.name),
A.map((name) => name.split(' ')[1])
);
export interface UserEntity {
id: number;
gender: 'F' | 'M';
name: string;
}
export function getUsers(): UserEntity[] {
return [
{
id: 1,
gender: 'F',
name: 'jane park',
},
{
id: 2,
gender: 'M',
name: 'ivan kim',
},
{ id: 10, gender: 'F', name: 'oll lee' },
];
}
export function filterGender(gender: 'F' | 'M', users: UserEntity[]) {
return users.filter((user) => user.gender == gender);
}
// wrong case 1
// Argument of type 'UserEntity[]' is not assignable to parameter of type '"F" | "M"'.ts(2345)
pipe(
getUsers(),
filterGender);
// wrong case 2
// Argument of type 'UserEntity[]' is not assignable to parameter of type '(a: UserEntity[]) => unknown'.
// Type 'UserEntity[]' provides no match for the signature '(a: UserEntity[]): unknown'.ts(2345)
Expected 2 arguments, but got 1.ts(2554)
pipe(
getUsers(),
filterGender('M'));
그렇다면 gender 를 주면 되지 않을까? 이지만 interface 의 갯수가 충분치 않으므로 syntax 에러가 발생한다.
(또한 pipe 에는 실행되지 않은 형태의 함수가 주어져야하므로 interface 갯수가 맞는다 하더라도 실행은 불가능 하다)
실제 우리가 현업에서 구현하는 함수들은 다항 함수인 경우가 대부분이다. 그렇기에 pipe 를 현업에서 사용하는 것은 이러한 부분들을 고려해야한다. 그렇다면 어떻게 해야할까?
더 좋은 방법을 계속 찾고 있는 중 ...
- 결국 핵심은 다항 함수를 단항 함수로 변경하는 것이다. 그리고 이러한 목표를 위해서 사용할 수 있는 방법은 명확히 존재한다.
In mathematics and computer science, currying is the technique of translating the evaluation of a function that takes multiple arguments into evaluating a sequence of functions, each with a single argument
(wiki)
- 커링은 다항함수를 단항함수로 바꾸는 가장 쉬운 방법이다.
const filterMaleGender = (users: UserEntity[]) => filterGender('M', users); pipe( getUsers(), filterMaleGender);
pipe(
getUsers(),
(users: UserEntity[]) => filterGender('M', users));