한국어로 번역 또는 작성된 하스켈 관련 자료들을 모아둔다. (계속 업데이트 예정)
프로그램은 경우 따라 다른 방식으로 작동할 필요가 있다. 이것을 흐름 제어(flow control)라고 한다. C에서는 if, select-case같은 조건문이나 for, while 같은 반복문을 사용한다. Haskell에서는 반복 대신 순환을 사용하기 때문에 흐름 제어가 좀 더 간단하다. 리스트의 원소를 세는 함수를 하나 만들어보자.
length1 [] = 0 length1 (x:xs) = 1 + length1 xs
이미 이와 같은 예를 여러 번 보았기 때문에 자세한 설명은 하지 않을 것이다. 이렇게 똑같은 함수를 각각의 경우에 따라 만드는 방법을 Haskell에서는 패턴 맞춤(pattern matching)이라고 한다. length1 함수는 []과 (x:xs)라는 두 가지 패턴을 가지고 있다. 함수를 사용할 때 Haskell은 맞는 패턴을 가진 함수를 실행시킨다.
평면 위에 있는 점의 위치를 가리킬 때 가로 좌표와 세로 좌표를 묶어 (x, y)라고 말한다. 이렇게 여러 개의 값을 하나의 단위로 나타내는 것을 순서쌍(tuple)이라고 부른다. Haskell에서 순서쌍을 다루는 방법은 별로 어려울 것이 없다.
move (x, y) (a, b) = (x+a, y+b) move (1, 3) (2, 2) ⇒ (3, 5)
순서쌍과 리스트는 여러 개의 값이 들어가기 때문에 비슷해 보이지만, 단지 여러 개의 값이 모여있는 리스트와 달리 순서쌍은 좌표처럼 그 자체로 의미있는 값이다. 따라서 순서쌍에서 값의 개수는 고정되어 있다.
1부터 100까지 더하려면 C에선 다음과 같은 방법을 이용한다. ( 100 * 101 / 2 라는 간단한 공식이 있지만 그건 잠시 접어두자. )
int sum = 0; for(int i = 1; i < = 100; i++) sum += i;
이 구문은 다음과 같이 작동한다. 통제변수 i에 1을 대입한 다음, i가 100보다 작거나 같을 동안 i를 1씩 증가시켜주는 것이다. 함수편에서 보았듯이 Haskell에서는 변수라는 개념이 없기 때문에 이런 반복 구조는 사용할 수 없다. 대신 Haskell은 좀 더 쉽고 직관적인 방법을 사용한다.
Haskell 입문서입니다. 인터넷에서 구할 수 있는 입문서 중에서는 가장 쉽고, 다루고 있는 범위도 넓습니다. 강력추천.
Haskell Reference
Haskell 표준 함수들에 대한 설명과 예제를 제공합니다.
A Tour of the Helium Prelude
Haskell Prelude 함수들에 대한 정의, 구현, 예제
함수와 바꿔쓰기 규칙
함수형 언어는 '바꿔쓰기 규칙'에 바탕을 둔 프로그래밍 언어다. 바꿔쓰기 규칙이란 이름 그대로다. 다음과 같은 예를 보자.
a = 3 f x = x + 1
위의 코드에서 첫 줄은 "앞으로 a는 3으로 바꿔쓴다", "f x는 x + 1로 바꿔쓴다"라고 정의한 것이다. 여기서 a나 f처럼 맨 앞에 나온 이름을 함수라고 한다. f x의 x처럼 함수 뒤에 따라붙는 기호를 매개변수라고 한다. 매개변수는 실제로 x를 가리키는 것이 아니라 f 뒤에 따라붙는 값에 일시적으로 이름을 붙여주는 것이다. 그러니까 f 3이라고 쓰면 3 + 1, f 4라고 쓰면 4 + 1로 바꿔 쓴다. 만약 f a라는 표현이 있다면 a + 1로 바꿔쓰고 a + 1은 3 + 1로 바꿔쓴다. 마지막은 3 + 1은 4로 바꿔쓴다. 이런 식으로 더이상 바꿔쓸 수 없을 때까지 계속 바꿔쓴다. 다음 코드를 보면 함수형 언어와 명령형 언어의 결정적 차이를 알 수 있다.
대표적인 Haskell 사용 환경 중에 Hugs와 GHC이다. Hugs는 쉽고 빠른 인터프리터로서 교육용으로 널리 쓰인다. 반면 GHC에는 Haskell의 표준과 다양한 확장을 포함한 강력한 컴파일러이다. 여기서는 Hugs 사용법을 알아보도록 하겠다.
Linux/Unix 사용자는 2005년 5월판, MS 윈도 사용자는 2003년 11월판을 다운 받으면 된다. 2005년 5월판도 MS윈도에서 작동하지만 도스창에서만 사용할 수 있다. 설치는 매우 간단하므로 설명을 생략하겠다.
Hugs를 설치하면 윈도 기준으로 실행 아이콘이 4개나 된다. 윈도창에서 실행되는 WinHugs와 도스창에서 실행되는 Hugs가 있고, 이들 각각에 대해 Haskell98 모드(표준 모드)와 Hugs 모드(확장 모드)가 있다. 어느 것을 실행시키든지 큰 차이는 없다. 다만 WinHugs는 한글 출력에 조금 문제가 있다.
함수형 프로그래밍(functional programming:이하 FP)이라는 말이 사람들의 입에 오르내리고 있다. 이미 C++에는 STL이라는 FP 스타일의 표준이 도입되었으며, 널리 사용되는 Python도 FP 문법을 지원하고 있다. FP 프로그래밍이 이렇게 주목받는 이유는 과거의 명령형 프로그래밍에 비해 프로그램을 더 쉽고 간단하게 만들 수 있을 뿐만 아니라 더 안전하고 튼튼하게 만들어주기 때문이다.
그러나 FP는 과거에 한 번씩 유행을 탔던 여느 패러다임과 달리 설명하기가 쉽지 않다. 대부분의 프로그래밍 패러다임들이 새로운 개념을 더하는 방식이었던 반면에, FP는 컴퓨터가 만들어지기도 전에 고안된 순수한 수학적 개념으로 돌아가는 것이기 때문이다. 기존의 프로그래밍 개념에 익숙한 사람들에게는 아무리 말로 설명을 해줘도 이해하기 어렵기 때문에 차라리 함수형 언어를 배우는 편이 더 빠를지도 모른다.