Haskell
끝이 없는 리스트를 만들 수 있을까?
화면을 누르면 다음 장으로 넘어갑니다
Haskell
ML과 닮았지만 순수합니다
Haskell은 ML처럼 정적 스코프, 강타입, 타입 추론, 패턴 매칭을 갖췄습니다. 다른 점은 순수 함수형 언어(purely functional language)라는 것입니다. 변수도, 대입문도, 어떤 종류의 부작용도 없습니다.
지금까지 본 언어들 가운데 Haskell만 끝까지 순수 함수형입니다. Lisp는 처음에만 순수했고, ML도 순수하지 않습니다.
문법
같은 함수를 더 짧게 적습니다
7편의 팩토리얼을 Haskell로 적은 것입니다. fun도, 줄을 잇는 |도, 매개변수를 감싼 괄호도 없습니다. 패턴 매칭으로 위에서부터 맞춰 보는 것은 같습니다.
리스트
리스트를 규칙으로 적습니다
Haskell의 리스트도 대괄호로 적습니다. ..는 산술 수열을 만듭니다. [2, 4..10]은 2, 4처럼 2씩 늘려 10까지 가는 리스트입니다. ++는 두 리스트를 잇고, :는 요소 하나를 앞에 붙입니다.
리스트 내포
조건을 적으면 리스트가 만들어집니다
리스트 내포(list comprehension)는 수학에서 집합을 적는 방식으로 리스트를 만듭니다. [b | b ← t; b <= h]는 t에서 b를 하나씩 꺼내, h 이하인 것만 모은 리스트입니다.
h와 t의 값은 예시입니다. 7편의 filter(조건에 맞는 원소만 걸러 내는 함수)와 같은 일입니다.
퀵소트
퀵소트가 다섯 줄입니다
Haskell로 적은 퀵소트입니다. 빈 리스트는 그대로 빈 리스트입니다. 그 밖에는 첫 원소 h를 기준으로, h 이하인 것을 정렬한 리스트, [h], h보다 큰 것을 정렬한 리스트를 ++로 잇습니다.
정렬한 리스트 [4, 2, 7, 1, 5]는 예시입니다.
지연 평가
필요한 값만 계산합니다
엄격한 언어(strict language)는 함수를 부를 때 인자(실제 매개변수)를 모두 끝까지 평가합니다. 비엄격 언어(nonstrict language)는 그러지 않아도 됩니다. Haskell은 필요한 값만 계산하는 지연 평가(lazy evaluation)를 씁니다.
함수 f와 두 인자는 예시입니다.
무한 리스트
몇 칸이면 충분합니다
positives = [0..]은 0부터 끝없이 이어지는 리스트입니다. squares는 그 수들을 제곱한 무한 리스트입니다. member squares 16은 16이 제곱수인지 묻습니다. 앞에서부터 0, 1, 4, 9, 16까지만 만들어지고 답이 나옵니다.
member는 5편처럼 리스트에 그 값이 있는지 알아보는 함수입니다.
다음 편