함수형 언어에서는 기본적으로 함수를 기본 단위로 취급하기 때문에, 변수 대신에 함수를 인자로 넘길 일이 굉장히 많음.
흔히 말하는 map, filter 같은 놈들도 결국 인자를 함수로 받음.
이런 애들을 쓸 때 인자로 넘긴 변수 그 자체가 필요하더라도 함수를 요구하기 때문에 id function을 쓰는거임.
여기까지만 보면 이게 뭔소린가 할테니 몇 가지 예시를 가져왔음. 어떤 언어로 함수형을 배우는지 모르겠지만 난 F#으로 설명함.
혹시나 해서 말하자면, |>는 파이프라고 부르고, x |> f는 f x와 동일함.
1. 보통 id function을 어디다 써요?라고 물으면 가장 많이 등장하는 예시임.
List.collect 함수는 List의 각 원소를 주어진 함수에 통과시켜서 나온 결과물을 하나의 List로 합쳐서 리턴함.
이걸 이용해서 다음과 같이 리스트가 중첩된 경우에도 깔끔하게 합칠 수 있다.
이 코드는 [1; 2; 3; 4; 5; 6]을 출력할거임.
물론 이건 List.concat과 동일한 역할을 한다.
2. 변수 그 자체를 평가받고자 할 때. 우선 bool을 생각해볼 수 있다.
bool List가 있고, 여기서 true가 몇 갠지 알고 싶다고 하자. 보통 List에서 특정 조건을 만족하는 원소만 뽑아내고자 할 때는 filter를 쓴다.
그런데 원소 자체가 bool이라 이미 자체적으로 true/false가 명확하다면, 굳이 filter에 (fun x -> x = true)라고 쓸 이유가 없음.
그래서 filter의 조건으로 id를 바로 넣는다. 그러면 true인 애들만 뽑아낼 것이고, 따라서 이 코드는 3을 출력하게 됨.
그리고 이 내용을 좀 더 일반화한게 Option(하스켈에선 Maybe)임.
아래 내용을 이해하려면 choose 함수에 대해 알아야 한다. choose는 filter의 일반적인 버전임.
filter는 각 원소에 대해 true/false를 평가하는 함수를 받아서 그 중 true가 리턴된 원소를 원소로 하는 리스트를 만드는 함수고,
choose는 각 원소에 대해 Some x / None을 평가하는 함수를 받아서 그 중 Some x가 리턴된 원소에 대해 가공된 값인 x를 원소로 하는 리스트를 만드는 함수임.
자 이제 int option List가 있고, 여기서 Some의 값을 뽑아 새 리스트를 만들고 싶다고 하자.
가장 먼저 생각해볼 수 있는 코드는 이런 형태일 거임. 답이야 제대로 뽑아낼 수는 있지만 굉장히 보기 불편하다.
만일 F#에서 Option에 어떤 함수가 내장되어 있는지 알고 있다면 이렇게 줄여 쓸 수 있다. 함수 이름이 직관적이니 무슨 역할을 하는지는 생략함.
그리고 List.choose란 함수에 대해 안다면 다음과 같은 식으로 생각할 수 있다. 이미 리스트의 원소가 Option으로 이루어져 있으므로,
choose에 id를 집어넣어서 원소를 그대로 평가받게 하는 거임. 이러면 의도한 대로 [1; 4; 0]이라는 리스트를 얻을 수 있다.
아주 간단한 예시들만 가져온거고, 이런 것들 외에도 다양하게 쓰일 수 있다.
근데 결국 함수형 가지고 놀다보면 (fun x -> x) 형태의 함수가 필요한 순간이 오게 되니 굳이 언제 써야 한다고 외울 필요는 전혀 없다.
나도 그냥 생각나는대로 막 쓴거임.
개추 - dc App
이렇게 까지 친절하게 설명해주시다니... 감사합니다 ㅠㅠ 너무 감동인것이와요. 꼭꼭 씹어먹겠읍니다 센세
https://gall.dcinside.com/mgallery/board/view/?id=github&no=34054