모두를 위한 하스켈/초보자를 위한 하스켈 프로그램 자세한 안내

이 문서의 라이선스는 CC-BY 4.0을 따릅니다. 원저자는 가브리엘라입니다. 이 글의 원래 제목은 ⟨Detailed walkthrough for a beginner Haskell program⟩입니다.

이 문서에서는 작은 하스켈 프로그램 개발 과정을 단계별로 설명합니다. 만드는 프로그램은 코드 뭉치를 등호 기준으로 정렬합니다. 이 문서는 초보 프로그래머를 대상으로 합니다. 여러 단계와 개념을 자세히 설명합니다.

이 문서에서는 실험과 학습을 쉽게 하기 위해 파일 하나에 하스켈 프로그램을 작성하고 컴파일하며 실행합니다. 큰 하스켈 프로젝트를 할 때는 cabal이나 stack을 써서 프로젝트를 만들거나 실행하고 다른 사람과 프로젝트를 공유할 수 있습니다. 저는 주로 이런 방식으로 설명합니다. 이렇게 하면 프로그래밍 언어를 가볍게 시작하고 체험해볼 수 있기 때문입니다.

배경

+/-

저는 제가 쓰는 코드 가독성에 집착합니다. 쓰기 편한 것보다는 읽기 편한 것이 좋습니다. 코드 가독성을 높일 수 있는 방법 중 하나는 등호를 기준으로 정렬하는 것입니다. 예를 들어 다음과 같은 코드가 있습니다.

address = "192.168.0.44"
port = 22
hostname = "wind"

저는 보통 등호 기준으로 정렬하기 위해 수동으로 들여쓰기를 합니다.

address  = "192.168.0.44"
port     = 22
hostname = "wind"

저는 텍스트 에디터로 vim을 씁니다. vim에서는 Tabular 플러그인을 설치하면 등호 기준 정렬을 할 수 있습니다. 하지만 직접 바닥부터 구현하는 것이 함수형 스타일로 어떻게 프로그래밍을 하는지 보여주는 좋은 사례가 될 것 같습니다.

vim의 좋은 기능 중 하나는 아무 명령줄 프로그램을 이용해서 에디터 안에서 텍스트를 바꿀 수 있다는 것입니다. 예를 들어 비주얼 모드에서 텍스트를 선택하고 다음과 같이 입력합니다.

:!some-command

위와 같이 입력하면 vim에서 선택한 텍스트가 some-command라는 명령줄 프로그램 인자로 들어갑니다. some-command 프로그램의 표준 출력 결과를 원래 선택했던 텍스트와 바꿉니다.

저는 정렬할 텍스트를 표준 입력으로 받아 정렬된 텍스트를 표준 출력으로 보내는 코드를 작성하기만 하면 됩니다. 이 프로그램 이름을 align-equals라고 하겠습니다.

개발 환경

+/-

명령줄은 제 IDE나 마찬가지입니다. 저는 보통 터미널 창 세 개를 띄웁니다.

  • vim으로 텍스트를 편집하는 창
  • ghcid로 타입 에러를 표시하는 창
  • 내가 입력한 코드를 REPL에서 테스트하는 창

저는 Nix를 사용합니다. 특히 개발 도구를 설정하기 위해 nix-shell을 사용합니다. 저는 제 전역 시스템에 불필요한 프로그램이 쌓이는 게 싫습니다. nix-shell을 사용하면 개발 도구나 라이브러리를 임시로 설정할 수 있습니다.

앞으로 나오는 예제는 다음과 같이 모두 Nix 셸에서 실행합니다.

$ nix-shell --packages 'haskellPackages.ghcWithHoogle (pkgs: [ pkgs.text pkgs.safe ])' haskellPackages.ghcid

터미널에서 위와 같이 입력하면 ghc, ghci, ghcid, hoogle이 임시로 설치된 셸을 쓸 수 있습니다. 이 셸에서는 하스켈 라이브러리 textsafe도 설치됩니다. 하스켈 패키지를 변경할 때는 명령줄을 편집해서 셸을 새로 만들면 됩니다.

새 창에 다음과 같이 입력해서 실시간 타입체킹을 합니다.

$ ghcid --command='ghci align-equals.hs'

위와 같이 입력하면 align-equals.hs 파일 내용이 변경되었을 때 자동으로 ghcid가 재시작됩니다. 하스켈 컴파일러가 에러나 경고를 찾을 경우 ghcid가 알려 줍니다.

두 번째 터미널에서는 편집 중인 코드를 ghci REPL에서 엽니다. ghci에서는 작성한 함수를 인터랙티브하게 테스트할 수 있습니다.

$ ghci align-equals.hs
GHCi, version 8.2.2: http://www.haskell.org/ghc/  :? for help
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, one module loaded.
*Main>

세 번째 터미널에서는 실제로 파일을 편집합니다.

$ vi align-equals.hs

프로그램

+/-

등호 앞쪽 코드 길이

+/-

결론

+/-

작지만 실용적인 프로그램을 만들었던 이런 과정이 하스켈 언어를 배우는데 도움이 되면 좋겠습니다. 하스켈은 여러 좋은 기능과 다양한 개념을 소개합니다. 이 글은 빙산의 일각일 뿐입니다.