모두를 위한 하스켈/초보자를 위한 하스켈 프로그램 자세한 안내
이 문서의 라이선스는 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
이 임시로 설치된 셸을 쓸 수 있습니다. 이 셸에서는 하스켈 라이브러리 text
와 safe
도 설치됩니다. 하스켈 패키지를 변경할 때는 명령줄을 편집해서 셸을 새로 만들면 됩니다.
새 창에 다음과 같이 입력해서 실시간 타입체킹을 합니다.
$ 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
프로그램
[+/-]등호 앞쪽 코드 길이
[+/-]결론
[+/-]작지만 실용적인 프로그램을 만들었던 이런 과정이 하스켈 언어를 배우는데 도움이 되면 좋겠습니다. 하스켈은 여러 좋은 기능과 다양한 개념을 소개합니다. 이 글은 빙산의 일각일 뿐입니다.