{{위키데이터 속성 추적}}
{{다른 뜻 넘어옴|해스켈}}
{{프로그래밍 언어 정보
|이름 = Haskell
|로고 = Haskell-Logo.svg|150px
|패러다임 = [[함수형 프로그래밍|함수형]]
|연도 = {{시작 날짜와 나이|1990|04|01}}<ref>
{{콘퍼런스 인용
|url =https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/history.pdf?from=https://research.microsoft.com/~simonpj/papers/history-of-haskell/history.pdf&type=exact
|제목 =A History of Haskell: Being Lazy With Class
|성1=Hudak
|이름1=Paul
|성2=Hughes
|이름2=John
|성3=Jones
|이름3=Simon Peyton
|성4=Wadler
|이름4=Philip
|날짜 =2007년 4월 16일
|연도 =2007년
|콘퍼런스 =HOPL III: Proceedings of the third ACM SIGPLAN conference on History of programming languages
|콘퍼런스url =https://dl.acm.org/doi/proceedings/10.1145/1238844
|쪽 = 5
|형식 =pdf
|doi =10.1145/1238844.1238856
|확인날짜 =2024년 10월 18일
|인용 =1 April 1990. The Haskell version 1.0 Report was published (125 pages), edited by Hudak and Wadler.
|언어 =영어
}}</ref>
|설계자 = [[:en:Simon Peyton Jones|Simon Peyton Jones]], [[:en:Paul Hudak|Paul Hudak]], Philip Wadler, ..
|최근 버전 = Haskell 2010<ref>
{{메일링 인용
|url=https://mail.haskell.org/pipermail/haskell/2009-November/021750.html
|제목=Announcing Haskell 2010
|날짜=2009년 11월 24일
|확인날짜=2024년 10월 18일
|메일링리스트=Haskell
|성=Marlow
|이름=Simon
|언어=영어
}}</ref>
|최근 버전 출시일 = {{시작 날짜와 나이|df=yes|2010|07}}
|형 체계 = 강적, 정적, 추론
|구현체 = GHC, Hugs, NHC, JHC, Yhc
|방언 = Helium, Gofer
|영향을 받은 언어 = [[리스프]], [[미란다 (프로그래밍 언어)|미란다]], [[스킴 (프로그래밍 언어)|스킴]], [[APL (프로그래밍 언어)|APL]], [[ML (프로그래밍 언어)|ML]], ..
|영향을 준 언어 = [[머큐리 (프로그래밍 언어)|머큐리]], [[비주얼 베이직 닷넷]], [[파이썬]], [[F 샤프]], [[스칼라 (프로그래밍 언어)|스칼라]] ..
|운영 체제 = [[크로스 플랫폼]]
|웹사이트 = {{공식 URL}}
}}
'''하스켈''' 또는 '''해스켈'''({{llang|en|Haskell}} {{IPA-all|ˈhæskəl}})은 순수 [[함수형 프로그래밍|함수형]] [[프로그래밍 언어]]이다. 교육계와 산업계 모두를 위해 설계된 하스켈은 [[타입클래스]], [[모나드 (컴퓨터 과학)|모나딕]] [[입출력|IO]]와 같은 여러 프로그래밍 언어의 기능을 개척하였다. 하스켈의 주된 구현체는 [[글래스고 하스켈 컴파일러|GHC(Glasgow Haskell Compiler)]]이다.

== 명칭 ==
프로그래밍 언어 하스켈은 [[논리학]]과 [[컴퓨터과학]]에 지대한 공헌을 한 [[논리학자]] [[해스켈 커리]]에서 이름을 따왔다. 그러므로 본디 ‘해스켈’로 불러야 하지만<ref>
{{메일링 인용
|url=https://mail.haskell.org/pipermail/haskell-cafe/2008-January/038756.html
|제목=anybody can tell me the pronuncation of "haskell"?
|날짜=2008년 1월 28일
|확인날짜=2024년 10월 17일
|메일링리스트=Haskell-cafe
|성=Chevalier
|이름=Tim
|언어=영어
}}</ref>
대한민국에서는 ‘하스켈’이 프로그래밍 언어를 가리키는 말로 널리 쓰여 굳어졌다.

== 역사 ==
[[1985년]]에 개발된 [[미란다 (프로그래밍 언어)|미란다]]가 하스켈의 전신이라고 할 수 있다.

[[1987년]] [[오리건주]] 포틀랜드에서 열린 ‘함수형 프로그래밍 언어와 컴퓨터 구조에 관한 총회’({{lang|en|Functional Programming Languages and Computer Architecture, FPCA '87}})에서 있었던 회의에서, 난립하고 있는 함수형 언어들을 통합 정리해서 훗날 언어 설계의 기반이 될 수 있는 일반적인 순수 함수형 프로그래밍 언어를 만들자는 데에 참가자들의 뜻이 모였고 위원회가 발족되었다.<ref>
{{웹 인용
|url=https://www.haskell.org/onlinereport/preface-jfp.html
|제목=Preface
|편집자=사이먼 페이튼 존스
|편집자-링크=사이먼 페이튼 존스
|날짜=2002년 12월
|웹사이트=The Haskell 98 Language Report
|확인날짜=2024년 10월 18일
}}</ref> 하스켈의 첫 버전(‘하스켈 1.0’)은 [[1990년]]에 완성되었다.<ref>{{웹 인용 |url=http://www.haskell.org/haskell-history.html |제목=The History of Haskell<!-- 봇이 붙인 제목 --> |확인날짜=2006-09-27 |보존url=https://web.archive.org/web/20090429085841/http://haskell.org/haskell-history.html |보존날짜=2009-04-29 |url-status=dead }}</ref> 위원회의 노력은 [[1997년]] 말까지 다양한 설계안으로 이어져 마침내 ‘하스켈 98’이라는 성과가 나왔다. 하스켈 98은 교육용이나 확장을 덧붙이는 토대로 쓸 수 있는 안정적이고, 작고, 이식성 좋은 언어 표준을 의도한 결과물로서 표준 [[라이브러리]]가 포함되어 있었다. 또한 위원회는 하스켈 98의 확장 기능과 더불어 하스켈 98에 실험적인 기능을 덧붙이거나 합친 변형이 만들어지는 것을 환영했다.

하스켈 98 언어 표준은 [[1999년]] 1월에 《하스켈 98 보고서》({{lang|en|The Haskell 98 Report}})라는 이름으로 정식 공개되었다. 그리고 [[2003년]] 1월에는 《하스켈 98 언어와 라이브러리: 개정 보고서》({{lang|en|Haskell 98 Language and Libraries: The Revised Report}})라는 이름으로 개정판이 나왔다.<ref>[http://haskell.org/onlinereport/ The Haskell 98 Language Report<!-- 봇이 붙인 제목 -->]</ref> 하스켈을 실제 컴퓨터로 쓸 수 있게 구현한 ‘글래스고 하스켈 컴파일러’와 ‘허그스’가 사실상의 표준 역할을 하면서 하스켈은 지금도 끊임없이 발전하고 있다.

[[2006년]]초에 하스켈 98 표준의 뒤를 이을 표준에 관한 논의가 시작되었다. 새로운 표준은 비공식적으로 ‘하스켈 프라임’({{lang|en|Haskell′}})이라는 이름으로 불렸으며, [[2009년 11월]] 새로운 표준의 첫 번째 판인 하스켈 2010이 발표되었다. 하스켈 2010은 다른 프로그래밍 언어와 호환할 수 있는 인터페이스인 외부 함수 인터페이스를 지원하고, 일부 문법이 변경되었으며, ''n''+''k'' 패턴이라 불리는 문법 형식이 금지되었다.

== 특징 ==
하스켈의 특징으로는 [[패턴 매칭]], [[커링]], [[조건제시법]], [[가드]], [[연산자]] 정의 등을 들 수 있다. [[재귀 함수]]나 [[대수적 자료형]]도 지원되고, [[느긋한 계산법]] 또한 하스켈의 특징으로 유명하다. [[모나드 (범주론)|모나드]], 타입 클래스 등은 하스켈만의 독창적인 개념이며 이러한 특징들은 절차적인 프로그래밍 언어에서 매우 힘들었던 순수 함수 정의를 손쉽게 만든다.

수학의 한 특이 분야인 [[범주론]]의 개념들, 특히 함수의 개념의 추상화된 형태인 [[사상 (수학)|사상]]과 [[모나드 (범주론)|모나드]]({{llang|en|monad}})를 차용하여 가져온 언어인데, 이를 통해 함수를 대상으로써 다룸에 있어서 명확성을 가질 수 있다.

2002년을 기준으로 하스켈은 [[느긋한 계산법]]을 쓰는 [[함수형 프로그래밍|함수형]] 언어 가운데 가장 활발한 연구가 이루어지는 언어로 볼 수 있다. 언어의 변형도 몇 가지 개발되었다. [[매사추세츠 공과대학교]]와 [[글래스고 대학교]]가 개발한 버전은 병렬화가 가능하기 때문에 ‘병렬 하스켈’이라고 불린다. 이후 병렬화와 분산 처리를 더욱 강화한 ‘분산 하스켈’과 에덴 프로그래밍 언어가 나왔고, 느긋한 계산법 대신 적극적인 계산법을 쓰는 ‘적극적 하스켈’이 있으며 하스켈에 [[객체 지향 프로그래밍|객체 지향]] 개념을 도입한 버전으로 ‘하스켈++’, ‘오하스켈’, 몬드리안 프로그래밍 언어 등등이 있다.

하스켈과 비슷한 언어로 [[그래픽 사용자 인터페이스]] 개발에 새로운 방법을 도입한 [[클린 (프로그래밍 언어)|클린]]이 있다. 이 언어와 하스켈의 가장 큰 차이점은 입출력을 위해 모나드 대신에 유일형을 사용한다는 것이다.

== 적용 ==
하스켈 사용자의 수는 상대적으로 적은 편이지만 그 강력함 때문에 몇몇 프로젝트를 쉽게 해주었다. 퍼그스({{lang|en|Pugs}})는 [[펄]] 6의 [[컴파일러]]와 [[인터프리터]]를 구현한 것인데 개발 기간은 지극히 짧았지만 만들어진지 몇 달도 채 되지 않아 꽤 쓸 만하다는 평을 받았다. [[서브버전]]과 비슷한 [[버전 관리|버전 관리 체계]]인 다크스({{lang|en|Darcs}})가 하스켈로 만들어지기도 했고, [[린스파이어]]는 시스템 도구 개발을 위한 언어로 하스켈을 선택했다.<ref>{{메일링 인용
|url=http://urchin.earth.li/pipermail/debian-haskell/2006-May/000169.html
|제목=Linspire/Freespire Core OS Team and Haskell
|날짜=2006년 5월 13일
|확인날짜=2024년 10월 17일
|메일링리스트=Debian-haskell
|성=Beshers
|이름=Clifford
|언어=영어
|보존url=https://web.archive.org/web/20171227234048/http://urchin.earth.li/pipermail/debian-haskell/2006-May/000169.html
|보존날짜=2017년 12월 27일
|url-status=dead
}}</ref>

== 구현체 ==
* [[글래스고 하스켈 컴파일러]]는 하스켈 컴파일러(GHC)와 대화식 환경(GHCi)으로 되어 있다.
* Hugs는 하스켈 인터프리터이다.

== 코드 예제 ==
하스켈로 [["Hello, World!" 프로그램]]은 다음과 같이 작성한다.

<syntaxhighlight lang="haskell">
module Main (main) where

main :: IO ()
main = putStrLn "Hello, World!"
</syntaxhighlight>

다음은 [[계승 (수학)|계승]]을 하스켈로 구현하는 몇 가지 방법이다.

[[패턴 매칭]]과 [[꼬리 재귀]]({{llang|en|tail recursion}})을 이용한 방법:
<syntaxhighlight lang="haskell">
 fac 0 = 1
 fac n = n * fac (n-1)
</syntaxhighlight>
if-then-else와 [[꼬리 재귀|꼬리 순환]]을 이용한 방법:
<syntaxhighlight lang="haskell">
 fac n = if n > 1 then n * fac (n-1) else 1
</syntaxhighlight>
고차 함수(high-order function)을 이용한 방법:
<syntaxhighlight lang="haskell">
 fac n = foldl1 (*) [n..1]
</syntaxhighlight>
product 함수를 이용한 방법(product 함수는 위의 foldl1 (*)과 같다.):
<syntaxhighlight lang="haskell">
 fac n = product [n..1]
</syntaxhighlight>

== 같이 보기 ==
* [[글래스고 하스켈 컴파일러]]
* [[해스켈 커리]]

== 각주 ==
{{각주}}

== 외부 링크 ==
{{위키공용분류}}
* {{언어링크|en}} {{공식 웹사이트}}
* {{언어링크|en}} [http://www.cs.nott.ac.uk/~gmh/book.html Programming in Haskell]
** {{언어링크|ko}} [http://pl.pusan.ac.kr/~haskell 하스켈로 배우는 프로그래밍](번역)
* {{언어링크|en}} [https://www.haskell.org/hugs/ 하스켈 구현체 Hugs 98 아카이브 페이지]

{{주요 프로그래밍 언어}}

{{전거 통제}}

[[분류:함수형 프로그래밍 언어]]
[[분류:교육용 프로그래밍 언어]]
[[분류:1990년 개발된 프로그래밍 언어]]
[[분류:하스켈 프로그래밍 언어 계열]]
[[분류:문학적 프로그래밍]]
[[분류:패턴 매칭 프로그래밍 언어]]
[[분류:정적 타입 프로그래밍 언어]]