하스켈

백괴사전, 내용 없는 백과사전
이동: 둘러보기, 찾기
New Bouncywikilogo 60px.gif
김두한이 너에게 현피를 신청했다. 아래로 피신해라!
하스켈

하스켈(영어: Haskell)은 쉽고, 간편하고, 이식성이 뛰어나고, 개발 속도와 실행 속도가 모두 빠르고, 우아하고, 아름답고, 부드럽고, 수학적이고, 합리적이고, 현대 프로그래밍 언어 연구의 총아라고 할 수 있는 순수 함수형 프로그래밍 언어이다. 이 언어에는 실용성이 전혀 없다는 지극히 사소한 단점이 있긴 하지만 그런 것은 하스켈이 쉽고, 간편하고, 이식성이 뛰어나고, 개발 속도와 실행 속도가 모두 빠르고, 우아하고, 아름답고, 부드럽고, 수학적이고, 합리적이고, 현대 프로그래밍 언어 연구의 총아인 순수 함수형 프로그래밍 언어이기 때문에 무시된다.

[편집] 특징

하스켈의 대표적인 특징은 변수와 부수효과가 없다는 것이다. 하스켈 측의 주장에 따르면, 대부분의 프로그래밍 언어에서 필수적인 개념인 변수가 하스켈에 없는 까닭은, 하스켈의 방식은 변수를 설정하고 단계적으로 그 값을 연산(operation)에 의해 변화시키면서 최종적인 결과로 이끌어가는 것이 아니라, 작은 함수들을 정의하고 연결하여 처음 입력값이 그 함수들을 거쳐 마침내 출력으로 나오는 구조를 취하고 있기 때문이다. 또 부수효과란, 함수가 호출되었을 때 반환값을 내놓기 위해 하는 일 이외의 모든 것을 가리키는 것으로, 예컨대 호출될 때마다 문자열을 출력하는 함수가 있다면 이 함수는 부수효과가 있는 함수이다. 하스켈에서는 어떤 함수에도 이런 부수효과가 있을 수 없도록 되어 있으며, 함수가 어디서 언제 호출되거나 인자가 같다면 반환값도 항상 같고, 아무리 호출되어도 함수 바깥의 어떤 상태에도 영향을 주지 않는다. 하스켈 측은 이를 '참조투과성'이라고 부르면서, 프로그래머가 언제든 안심하고 함수를 쓸 수 있고 또 함수들은 모두 프로그래머의 완벽한 통제 아래에 놓이며 대체 어떤 서브루틴에서 오작동이 일어났는지 알아내기 위해 눈에 핏발을 세우고 디버거를 통해 변수의 변화를 추적할 필요도 없다고 자랑한다.

이것은 20세기 전체를 통틀어 가장 거대한 규모의 거짓말로 꼽히며, 21세기 들어 2006년 현재에도 여기에 맞먹는 규모의 거짓말은 보고된 바가 없다. 하스켈에 변수와 부수효과가 없는 것은, 하스켈 표준 제정 위원회는 가난하고, 변수와 부수효과는 빌 게이츠가 특허를 가지고 있는 기술이기 때문이다. C/C++, 자바, 펄, PHP, 파이썬, 루비, 심지어 대부분의 베이직들까지, 변수와 부수효과가 있는 모든 프로그래밍 언어의 제작자들은 빌 게이츠에게 매년 막대한 특허 사용료를 갖다 바치고 있으며 이것이 빌 게이츠가 세계 1위의 부호인 진정한 이유이다.

[편집] 코드

하스켈로 쓴 코드는 같은 일을 하는 다른 언어 코드들보다 최대 1/20까지 짧아질 수 있다. 하지만 하스켈로 코드를 짜면 다른 언어로 코드를 짤 때보다 머릿속이 최대 20만 배 이상 더 복잡해질 수 있기 때문에 아무도 하스켈을 실전 프로그래밍에 사용하지는 않는다. 하스켈은 잘난 척을 하거나, 정보 올림피아드 문제처럼 실생활 프로그래밍에 전혀 쓸 일이 없는 알고리즘을 괴상하게 생긴 코드로 짜서 심사위원의 판단력을 흐려 놓기 위해서 주로 사용된다. 하지만 안타깝게도 정보올림피아드 에서는 나치크로소프트의 비주얼 c++를 채점 언어로 사용한다.

[편집] 예제

Hello World 프로그램을 먼저 보여주는 게 정석이지만 일단 넘어간다. 하스켈로 코드를 짤 때 프로그래머를 즐겁게 만들어 주는 특징으로는 강력한 타입 추론 시스템, 타입 클래스, 재귀 정의와 무한 구조, 패턴 매칭, 느긋한 계산법(영어: lazy evaluation) 등등 많다. 라지만 일반적인 언어를 사용하던 사람에게는 괴롭게 다가올 가능성이 크다. 우선 주어진 수의 팩토리얼을 구하는 다음 함수 정의를 보자.

fac   :: Int -> Int
fac 0 = 1
fac n = n * fac (n-1)

첫 줄은 함수 fac의 타입을 지정한다. 아래의 두 줄은 패턴 매칭으로 팩토리얼을 정의하고 있다. 눈여겨볼 곳은 마지막 줄인데, fac의 값을 자기 자신을 써서 정의하고 있다. 루프가 어디에서도 사용되지 않기 때문에 짧으면서도 우아하게 코드를 작성할 수 있다. (이것도 거짓말이다. 변수를 사용할 수 없었기 때문에 루프를 쓸 수가 없어 만들어진 방법이다.) 하스켈로 코드를 짤 때는 이런 것이 당연한 일로 취급된다. 개초보도 재귀 정의를 하는 법을 배운다.

(사실 라이브러리 함수 product를 쓰면 한 줄로 코드가 끝난다. 아쉬운 점은 product가 재귀적으로 정의된다는 것이다.)

fac n = product [1..n]



개인 도구
이름공간 목록 보기/편집
변수
행위
차림표
아랫방
자매 프로젝트
유지보수
커뮤니티
도구 모음
다른 언어