Table of contents
들어가며
하스켈 코드를 작성 방법으로 크게 두 가지가 있습니다. 레이아웃 구문이라는 형태와 명시적 구분 기호를 사용하는 방법입니다. 우리는 오늘 이 두 가지에 대해 알아보고자 합니다.
Layout 구문
하스켈 코드 구문은 대체로 레이아웃(layout)이라는형태로 작성합니다. 들여쓰기(indentation)라고도 하지만 오프사이드 규칙(off-side rule)이라고도 합니다.
이 형태는 Landin의 ISWIM 언어에서 시작되어 나중에 Miranda 언어도 사용하게 되었어요. Haskell은 Miranda의 오프사이드 규칙과 비슷한 형태로 사용하고 있습니다. Python과 F#은 공백 구분 구문(whitespace-sensitive syntax)이라는 용어로 채택해서 사용하고 있습니다.
하스켈 코드 예를 들어보겠습니다. 키보드로 입력받은 문자열을 name
으로 바인딩하지만 터미널로 name1
을 변수(수학과 함수형 언어 개념을 빌려와 따지자면 레이블이나 상수 함수에 가까움)를 출력하는 쓸데없는 코드입니다.
module Lib
where
someFunc = do
name <- getLine
let name1 = "One"
name2 = "Two"
putStrLn name1
return ()
키보드로 Hello
라고 입력하면 터미널에는 One
이 출력될 겁니다.
# create this project with stack
$ stack run
Hello
One
Explicit Delimiters
하지만 C/C++, Java, JavaScript에서와 같이 명시적 구분 기호(explicit delimiters)인 중괄호{}
와 세미콜론;
으로 작성할 수도 있습니다. 위키피디아에 이것을 지원하는 이유가 나와 있습니다. 명시적 구분 기호가 Haskell 소스 코드의 자동 생성이 더 쉬워지기 때문이라고 합니다. 하지만 제 생각은 더 헷길리는 것 같습니다.
레이아웃(layout) 구문으로 작성한 하스켈 코드를 명시적 구분 기호(explicit delimiters)로 작성해보았습니다.
module Lib
where
someFunc = do {
name <- getLine;
let {
name1 = "One";
name2 = "Two";
};
putStrLn name1;
return ();
};
키보드로 Hello
라고 입력하면 터미널에는 One
이 출력될 겁니다. 하스켈 레이아웃 구문으로 작성한 코드와 완전히 똑같은 결과를 냅니다.
# create this project with stack
$ stack run
Hello
One
마무리
하스켈 언어를 시작할 때는 레이아웃 구문으로 먼저 익히는 게 좋을 듯합니다. 익숙해지면 명시적 구분 기호로 응용해서 사용하면 혼란이 적을 듯해요.