1. ->와 =>의 차이

  • 함수형 프로그래밍에서 처음 헷갈렸던 것은 두 종류의 화살표 표기였습니다. -> => 가 무엇이 다른가 한번 알아봅시다. 우선 실제 코드에서 쓰인 예시입니다.
let parseInts = line => line->Js.String2.split("\t")->Array.map(int_of_string);
  • => 표기는 JavaScript에서 많이 보던 표현이라 익숙하고, 실제로 그 의미와 사용법도 동일합니다. a => b 이면 a를 인자로 가지며 b의 로직을 실행하는 함수의 정의 입니다.

  • -> 는 Pipe Operator 라고 합니다. 참조에서도 볼 수 있듯 함수의 실행 입니다. a(b) 가 b->a 가 되는 셈이죠. => 와 다른점은 b->a는 결과값을 반환한다는 점입니다. 이제 다시한번 위의 예시코드를 분석해봅시다.

let parseInts = line => line->Js.String2.split("\t")->Array.map(int_of_string);
  • 우선 parseInts 는 함수입니다. 함수를 실행한 값이 아닌 함수의 정의 입니다.
    let parseInts = line => // function 
    
  • 그 다음은 전부 Pipe operator 이므로, 다른 함수들의 실행한 값으로 로직이 전개됩니다. a(b) 가 b->a가 되니까 가장 nested 된 부분이 실제로는 가장 앞에 있다는 것을 기억하면,
let parseInts = line => line->Js.String2.split("\t")->Array.map(int_of_string);

//nested function 포맷
let parseInts = line => Array.map(int_of_string(Js.String2.split("\t", line)))
  • 이렇게 되겠네요. 즉 위의 함수는 주어진 line을 탭(\t)으로 잘라서 나온 각각의 string을 int로 변환시키는 작업을 합니다.

  • 위의 함수가 중첩된 모양을 보니 왜 pipe operator를 쓰는지 알 것 같습니다. pipe operator는 데이터 처리과정을 알기쉽게 풀어서 보여주는 역할을 하고 있기 때문에 한번 따라 가는것만으로도 parseInt가 뭘 하는지 파악할 수 있습니다. line을 -> tab을 기준으로 잘라서 -> int 타입으로 변경해라! 라는 식으로요.