ML
함수형 언어도 타입을 엄격하게 따질까?
화면을 누르면 다음 장으로 넘어갑니다
ML
문법도 타입도 Scheme과 다릅니다
ML은 정적 스코프를 쓰는 함수형 언어인데, 문법은 Lisp보다 Pascal에 가깝습니다. 강타입 언어여서 타입 오류가 언제나 잡히고, 타입을 알아서 바꿔 주는 강제 변환이 없습니다.
ML에는 예외 처리와 모듈, 리스트도 들어 있습니다.
함수 선언
fun 이름(매개변수) = 식
ML의 함수 선언은 fun 이름(매개변수) = 식 모양입니다. cube는 2편에서 본 세제곱 함수입니다. x : int는 x의 타입이 정수(int)라는 선언입니다.
cube(2)는 예시입니다. ML은 이름과 타입을 평가 환경(evaluation environment)이라는 표에 적어 둡니다.
타입 추론
타입을 안 적으면 ML이 알아냅니다
4강에서 본 타입 추론(적지 않은 타입을 언어가 알아내는 것)입니다. 타입을 한 군데만 적어도 ML이 나머지를 알아냅니다. 전혀 적지 않으면 수의 기본 타입인 int로 정합니다.
같은 이름의 함수를 여럿 만드는 오버로딩은 허용되지 않습니다. 실수용 세제곱 함수는 이름이 달라야 합니다.
패턴 매칭
인자의 모양을 위에서부터 맞춰 봅니다
ML에도 if 조건 then 식 else 식 모양의 선택이 있지만, 더 자주 쓰는 것은 패턴 매칭(pattern matching)입니다. 함수를 매개변수의 모양별로 나눠 적어 두면, 위에서부터 맞춰 보고 처음 맞는 줄을 씁니다.
fact는 2편에서 본 팩토리얼입니다. fact(3)과 fact(1)은 예시입니다.
리스트
::로 붙이고, ::로 가릅니다
ML의 리스트는 [3, 5, 7]처럼 대괄호로 적습니다. ::는 Scheme의 CONS로, 요소 하나를 앞에 붙입니다. 매개변수 자리에 h :: t라고 적으면 거꾸로, 받은 리스트가 첫 요소 h와 나머지 t로 갈라져 들어옵니다.
CAR는 hd, CDR는 tl입니다. []는 빈 리스트입니다.
filter
조건에 맞는 원소만 걸러 냅니다
filter는 조건 함수를 매개변수로 받는 고차 함수입니다. 원소마다 조건을 물어 참인 것만 모은 새 리스트를 돌려줍니다. 조건은 흔히 람다 식으로 넘기는데, ML에서는 fn으로 적습니다.
fn(x) => x < 100은 x를 받아 100보다 작은지 답하는 이름 없는 함수입니다. 100은 100보다 작지 않습니다.
커링
인자를 하나씩 받는 함수
ML 함수는 사실 매개변수를 하나만 받습니다. 쉼표로 나눠 둘을 주면 튜플(값 여럿을 묶은 것) 하나로 봅니다. 쉼표 없이 적은 add는 a를 받아 'b를 받는 함수'를 돌려줍니다. 이렇게 바꾸는 것이 커링(currying)입니다.
add 3 5는 교재의 호출 예입니다. 값 8은 3 + 5입니다.
다음 편