Haskell’s Syntax Layout

Haskell’s Syntax Layout

들어가며

하스켈 코드를 작성 방법으로 크게 두 가지가 있습니다. 레이아웃 구문이라는 형태와 명시적 구분 기호를 사용하는 방법입니다. 우리는 오늘 이 두 가지에 대해 알아보고자 합니다.

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

마무리

하스켈 언어를 시작할 때는 레이아웃 구문으로 먼저 익히는 게 좋을 듯합니다. 익숙해지면 명시적 구분 기호로 응용해서 사용하면 혼란이 적을 듯해요.