함수형 프로그래밍이란?
●함수형 프로그래밍이란?
●부수 효과
●함수 합성
특정 함수의 공역이 다른 함수의 정의역과 일치하는 경우, 두 함수를 이어서 새로운 함수를 만드는 연산을 함수 합성(Function Composition) 이라고 하며 프로그래밍에서 공역과 정의역은 타입에 해당되며 쉽게 말하면, A 함수에서 int 타입을 반환하고, B 함수에서 int 타입을 인자로 받는다면, B(A())와 같은 형태로 호출하는 것을 함수 합성이라고 함
함수형 프로그래밍은 함수를 합성하여 복잡한 프로그램을 쉽게 만들며 함수는 입력이 들어오면 부수 효과의 발생과 함께 결과를 반환할 수 있지만, 부수 효과가 존재하는 함수는 합성하기가 까다로움
// 부수효과가 존재하는 sum 함수는 다른 함수와 합성하기 까다로울 수 있다.
// 1. 다른 함수에서 1부터 1,000까지 더하는 함수가 필요하다면?
// 2. 다른 함수에서 1부터 100까지 곱하는 함수가 필요하다면?
int sum() {
int sum = 0;
for(int i = 1; i <= 100; i++) {
sum += i;
}
return sum;
}
class FunctionCompositionTest {
@Test
@DisplayName("함수 합성")
void fp() {
System.out.println(sum());
System.out.println(factorial(10));
}
// 1부터 100까지의 합
private int sum() {
return loop((a, b) -> a + b, 0, range(1, 100));
}
// 팩토리얼
private int factorial(int n) {
return loop((a, b) -> a * b, 1, range(1, n));
}
private int loop(BiFunction<Integer, Integer, Integer> fn, int sum, Queue<Integer> queue) {
if (queue.isEmpty()) {
return sum;
}
return loop(fn, fn.apply(sum, queue.poll()), queue);
}
private Queue<Integer> range(Integer start, Integer to) {
return IntStream.rangeClosed(start, to)
.boxed()
.collect(Collectors.toCollection(LinkedList::new));
}
}