나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2024-12-17 17:15:54

Haskell


파일:하위 문서 아이콘.svg   하위 문서: Haskell/문법
, Haskell/하스켈로 만든 프로그램
, Haskell/특징
, Haskell/학습
, Haskell/하스켈을 쓰는 회사
, Haskell/개발 환경
#!wiki style="display: inline; display: Haskell/도서 목록;"
, Haskell/도서 목록}}}
프로그래밍 사이트 선정 프로그래밍 언어 순위 목록
{{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all"
{{{#!wiki style="display: inline-table; min-width: 25%; min-height: 2em;"
{{{#!folding [ IEEE Spectrum 2024 ]
{{{#!wiki style="margin: -5px 0"
<rowcolor=#fff> 스펙트럼 부문 상위 10개 프로그래밍 언어 직업 부문 상위 10개 프로그래밍 언어
1 Python 1 SQL
2 Java 2 Python
3 JavaScript 3 Java
4 C++ 4 TypeScript
5 TypeScript 5 SAS
6 SQL 6 JavaScript
7 C# 7 C#
8 Go 8 HTML
9 C 9 Shell
10 HTML 10 C++
}}}
}}}
}}}
[ Stack Overflow 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=#FFA500><tablebgcolor=#fff,#222> 2024년 Stackoverflow 설문조사 기준 인기 상위 25개 프로그래밍 언어 ||
1 JavaScript 14 Rust
2 HTML, CSS 15 Kotlin
3 Python 16 Lua
4 SQL 17 Dart
5 TypeScript 18 어셈블리어
6 Bash 19 Ruby
7 Java 20 Swift
8 C# 21 R
9 C++ 22 Visual Basic
10 C 23 MATLAB
11 PHP 24 VBA
12 PowerShell 25 Groovy
13 Go
[ TIOBE 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=deepskyblue><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 MATLAB
2 C++ 12 Delphi / Object Pascal
3 C 13 PHP
4 Java 14 Rust
5 C# 15 Ruby
6 JavaScript 16 Swift
7 SQL 17 Assembly language
8 Visual Basic 18 Kotlin
9 Go 19 R
10 Fortran 20 Scratch
{{{#!wiki style="margin: 0 -10px -5px; min-height: calc(1.5em + 5px);"
{{{#!folding [ 21위 ~ 50위 펼치기 · 접기 ]
{{{#!wiki style="margin: -5px -1px -11px"
21 COBOL 36 Scala
22 Classic Visual Basic 37 Transact-SQL
23 LISP 38 PL/SQL
24 Prolog 39 ABAP
25 Perl 40 Solidity
26 (Visual) FoxPro 41 GAMS
27 SAS 42 PowerShell
28 Haskell 43 TypeScript
29 Dart 44 Logo
30 Ada 45 Wolfram
31 D 46 Awk
32 Julia 47 RPG
33 Objective-C 48 ML
34 VBScript 49 Bash
35 Lua 50 Elixir
}}}}}}}}} ||
[ PYPL 2024 ]
||<tablewidth=100%><width=9999><-4><bgcolor=green><tablebgcolor=#fff,#222> 2024년 8월 기준 검색어 점유율 상위 20개 프로그래밍 언어 ||
1 Python 11 Objective-C
2 Java 12 Go
3 JavaScript 13 Kotlin
4 C# 14 MATLAB
5 C/C++ 15 PowerShell
6 R 16 VBA
7 PHP 17 Dart
8 TypeScript 18 Ruby
9 Swift 19 Ada
10 Rust 20 Lua

}}} ||
프로그래밍 언어 목록 · 분류 · 문법

main = putStrLn "Hello, world!"
하스켈
Haskell
파일:Haskell 로고.svg파일:Haskell 로고.svg
최초 공개 1990년 4월 1일 ([age(1991-02-20)]년 전)
최신 버전 GHC 9.12.1 (2024년 12월 16일 릴리즈)
파일:홈페이지 아이콘.svg
1. 개요2. 등장배경과 역사3. 특징4. 수학과의 관련성5. 모토6. 어록7. 밈8. 안 써요9. 하스켈로 만든 프로그램10. 하스켈을 쓰는 회사11. 예제12. 문법13. 학습14. 개발 환경15. GHC 확장16. 영향 받은 언어 목록17. 도서 목록18. 여담19. 관련 문서20. 외부 링크

[clearfix]

1. 개요


하스켈(Haskell)은 순수 함수형 프로그래밍 언어이다.[1] I/O와 같이 필요한 경우가 아니면 부작용이 없는 순수 함수로만 만들어졌다.

가장 많이 쓰이는 하스켈 컴파일러로는 GHC(Glasgow Haskell Compiler)가 있으며, 여기에 패키지 매니저를 추가한 플랫폼이 Stack이다. Stack을 설치하면 GHC도 함께 설치되기 때문에, 특별한 이유가 없을 경우 Stack을 설치하면 된다.

최근에는 설치 프로그램으로 GHCup을 많이 사용한다.

하스켈 로고는 람다대수에서의 λ와 모나드에 사용하는 bind 연산자인 >>=를 겹쳐놓은 이미지다.

2. 등장배경과 역사

하스켈 보고서 버전 표
버전 출시일 쪽수
1.0 1990년 4월 125
1.1 1991년 8월 153
1.2 1992년 3월 164
1.3 1996년 5월 140[2]
1.4 1997년 4월 139 + 73
98 1999년 2월 150 + 89
98 개정판 2002년 12월 260
2010 2010년 4월 329
하스켈은 1985년 등장한 느긋한 계산으로 작동하는 함수형 언어 미란다[3]의 뒤를 이어, 상용 프로그래밍 언어 따위가 순수 함수형 언어를 대표하는 것이 마음에 안 드는 함수형 언어와 컴퓨터 아키텍처 연구 학술회에서 1987년부터 설계를 시작했다.(원래는 미란다를 직접 계승하려고 했는데 미란다 제작자인 데이비드 터너가 반대해서 바닥부터 만들었다.)[출처]

언어의 이름인 하스켈은 논리학컴퓨터과학에 지대한 공헌을 한 하스켈 브룩스 커리(Haskell Brooks Curry)의 이름에서 가져왔다.[5]

목표는 순수 함수형 프로그래밍 언어의 원형을 정의하는 것으로 학술 조직이 주도한 언어답게 디자이너가 다 타려면 미니 버스가 필요할 정도로 많고, 개발 속도는 티스푼 공사만큼이나 느리다는 특징이 있었다(...).

하여간 최초 논의로부터 3년 뒤인 1990년 4월 1일[6], 1.0 버전[7]의 보고서가 발표되었고, 1.1 ~ 1.4 버전을 거쳐, 1999년에 가장 널리 알려진 버전인 하스켈 98 보고서가 나왔다.[8]

2003년, 하스켈 98 보고서의 개정판이 나왔지만 개념적으로 바뀐 사항은 없고, 일부 작은 오류에 대한 수정과 애매한 표현 등을 다듬은 정도였다. 즉 언어의 개정판이 아니라 어디까지나 보고서의 개정판이다.[9]

2021년 시점에서 최신 정의는 여전히 하스켈 2010이다.[10] 다만 하스켈 2010 역시 그리 바뀐 것은 없다.

2016년 4월 Haskell 2020 위원회가 출범[11]했지만 Haskell 2020은 결국 나오지 않았고 위원회도 좌초된 상황이다.

하스켈 2010 이후의 발전은 컴파일러인 GHC 차원의 기능 확장에 의존하고 있다. 일반적으로는 이와 반대로 언어가 먼저 만들어진 뒤 컴파일러가 언어를 구현한다.

GHC 9.10.1부터 GHC2024를 지원한다.[12]

2024년 9월 이탈리아 밀란에서 열린 국제 함수형 프로그래밍 컨퍼런스[13]에서 사이먼 페이튼 존스가 GHC 개발 현황에 대해 발표했다.[14]

3. 특징

파일:상세 내용 아이콘.svg   자세한 내용은 Haskell/특징 문서
번 문단을
부분을
참고하십시오.

4. 수학과의 관련성

위의 내용을 읽어 보았다면 알겠지만 각종 수학 이론을 이용해서 언어를 만들어 보자는 의도로 만들어진 언어이므로 수학과의 관련성은 어느 정도 있다. 그렇다고 해서 하스켈로 프로그래밍을 하기 위해 기저의 수학을 잘 알고 있어야 하는 것은 아니며, 실제로도 많은 하스켈 프로그래머들이 하스켈의 바탕이 되는 전공수학 및 논리를 따로 배우지 않고도 능히 현업에 종사하고 있다. 알면 도움되지만, 모른다고 해서 문제가 되는 것은 아니다. 쉽게 생각하면 한없이 쉽고 어렵게 생각하면 한없이 어려워진다고 보는 것이 맞다.

5. 모토

Avoid success at all costs.
Simon Peyton Jones
하스켈의 비공식적 모토로 널리 알려진 발언이다. 두 가지로 해석할 수 있다.

본래 의도한 의미는 Avoid (success at all costs)이고, 직역하면 '모든 비용 면에서 성공하는 것을 피해라.'이다. 좀 더 풀어서 말하면 '(언어의) 성공을 위해 모든 것을 타협하려고 하지 마라.'는 뜻이다. 인기와 범용성을 위해 안전함, 표현력, 효율성 등 하스켈이 가진 특징을 희생해서는 안 된다는 의미이다.

다르게는 '수단과 방법을 가리지 말고 성공을 피해라.'라는 의미도 된다.

6. 어록

하스켈 프로그램은 일단 컴파일 되기만 하면 잘 동작할 것이다.
If a Haskell program compiles, it probably works.
출처 미상
모나드는 부리토다.
Monads are Like Burritos.
Brent Yorgey[18]
"마스터 요다, 제 하스켈 프로그램이 너무 느립니다!"
"포스(force)를 써라, 루크!"
하스켈 위키
하스켈은 정말 많은 언어들의 발전을 이끌어 왔습니다. 그리고 앞으로도 계속 그럴 것이라고 확신합니다.
Haskell has pushed so many languages forward. And I'm sure it will continue do so.
마티아스 빌만[19]
하스켈은 쓸모없다.
Haskell is useless.
사이먼 페이튼 존스[20]
하스켈은 세계 최고의 명령형 프로그래밍 언어이자, 두 번째로 좋은 함수형 언어이다.
Haskell is, in my view, the world’s best imperative programming language, and second-best functional language.
로버트 하퍼[21]
사실, 하스켈은 자신의 이름을 별로 좋아하지 않았어요.
You know, Haskell actually never liked the name Haskell.
하스켈 커리의 부인 버지니아 커리[출처]
모나드를 이해하는 순간 당신은 남에게 모나드를 설명할 수 없게 된다.
The problem with monads is that once you know what is, you lose the ability to explain it.

7.

파일:Haskell.jpg
Haskell 팬들에게 Java는 덩치만 크고 무너지기 쉽고, C는 포인터 잘못 다뤘다간 터지는 시한폭탄 같고, PHP는 사고가 터지면 대형참사급이고, Ruby는 동적 타입 언어이니 까 보기 전까지는 모른다고 인식된다는 것. 반면에 Haskell은 전체적으로 인식이 천재 아인슈타인. LISP는 뭐...

8. 안 써요

파일:haskellxkcd.png[23]

인기는 두말할 것도 없이 바닥이다. 표현력이 좋고, 코드가 간결하며, 알고리즘의 구현이 직관적이고, 부작용이 없고, 동시성이 보장되는 건 좋은데 애초에 함수형 언어라는 게 일반적인 프로그래밍 언어와 체계가 너무나 달라서 쉽게 익숙해지기도 어렵고 현실적으로 사용하기 어려운 점이 많다. 그 결과로 시도하는 사람 자체가 적어서 잘 아는 사람이 많지 않으니 사용 예가 적고, 사용 예가 적으니 배우려는 사람이 적다... 의 무한 반복.
[x^2 | x <- [1..]]
당장 개중에 쉬운 편에 속하는 위의 무한 제곱 리스트 코드도 LISPErlang을 공부한 사람이 아닌 이상 별다른 학습 없이 이해하기가 어렵다. 그나마 LISP가 함수형 언어 중에서 비중이 크다 보니 상당히 밀리고, 산업계에서는 Java와 호환되며 OOP도 지원하는 Scala가 함수형 언어로서 훨씬 인기를 끌고 있다.

9. 하스켈로 만든 프로그램

파일:상세 내용 아이콘.svg   자세한 내용은 Haskell/하스켈로 만든 프로그램 문서
번 문단을
부분을
참고하십시오.

10. 하스켈을 쓰는 회사

파일:상세 내용 아이콘.svg   자세한 내용은 Haskell/하스켈을 쓰는 회사 문서
번 문단을
부분을
참고하십시오.

11. 예제

다음은 사용자 입력을 받아 인사말을 출력하는 하스켈 코드이다.
main = do
  name <- getLine
  putStrLn ("Hello " ++ name)

아래는 퀵 정렬 함수를 하스켈로 구현한 코드이다.[26]
qsort []	 = []
qsort (x:xs) = qsort small ++ mid ++ qsort large
  where
    small = [y | y<-xs, y<x]
    mid   = [y | y<-xs, y==x] ++ [x]
    large = [y | y<-xs, y>x]

12. 문법

파일:상세 내용 아이콘.svg   자세한 내용은 Haskell/문법 문서
번 문단을
부분을
참고하십시오.

13. 학습

파일:상세 내용 아이콘.svg   자세한 내용은 Haskell/학습 문서
번 문단을
부분을
참고하십시오.

14. 개발 환경

파일:상세 내용 아이콘.svg   자세한 내용은 Haskell/개발 환경 문서
번 문단을
부분을
참고하십시오.

15. GHC 확장

GHC는 플래그가 너무 많아서 UN 깃발 수보다 많다.
GHC has more flags than the UN.
shapr[27]
GHC 확장(extension)은 하스켈 컴파일러 GHC에서 제공하는 추가 기능이다. 소스 코드 상단에 선언해서 확장을 사용할 수 있다. 예를 들어 FooBar라는 이름의 확장을 사용하려면 아래처럼 적는다.
{-# LANGUAGE FooBar #-}
GHCi 인터프리터에서 확장을 사용하려면 아래와 같이 입력한다.
:set -XFooBar
다음과 같은 목록 등이 있다. 확장의 종류가 너무 많아서 여기에 모두 적기는 곤란하다.
한편 언어 에디션(language edition)은 여러 GHC 확장의 묶음이다. 언어 에디션별로 지원하는 확장의 개수는 아래 표와 같다.[28]
에디션 확장 개수 GHC 버전
Haskell98 10
Haskell2010 7
GHC2021 47 9.2.1부터
GHC2024 54 9.10.1부터

16. 영향 받은 언어 목록

하스켈에게 영향을 받은 다른 프로그래밍 언어 목록은 다음과 같다.

17. 도서 목록

파일:상세 내용 아이콘.svg   자세한 내용은 Haskell/도서 목록 문서
번 문단을
부분을
참고하십시오.

18. 여담

19. 관련 문서

20. 외부 링크


[1] 정확히는 디버깅 용도를 위해 존재하는, 일반적으론 쓰면 안 되는 함수를 제외하면 순수하다.[2] Language and library specification하스켈 위키[3] 상업적으로 어느 정도 성공을 거두었다.[출처] A History of Haskell: Being Lazy With Classpdf[5] 참고로 이 아저씨의 퍼스트네임 뿐만 아니라 미들네임과 성을 가지고도 프로그래밍 언어가 나와있다.(...)[6] 일부러 만우절을 골라서 발표했다. 그 이후로도 하스켈 98 보고서나 관련된 책들을 만우절에 발표하곤 했다.[7] 당시에는 IO 처리에 악명 높은(?) 모나드 대신 Stream model이 사용되었다.[8] Haskell 98 Language and Libraries The Revised Report[9] A History of Haskell: Being Lazy With Classpdf, 5p[10] Haskell 2010 Language Report[11] ANN: Haskell Prime 2020 committee has formed메일링리스트[12] Version 9.10.1haskell.org[13] ICFP 2024[14] [ICFP'24] Orange 3 - Haskell (Sep 6th)유튜브[15] 수학적 귀납법을 떠올리면 간단하다. 베이스가 되는 객체들이 있고, 그 객체들을 이용하여 A, B 가 타입이면 A→B 도 타입이다같은 정의를 주면, A 가 타입이면 A→A 가 타입이고, A→A 가 타입이면 (A→A)→A 혹은 (A→A)→(A→A) 가 타입이고...하는식으로 죽죽 나간다. 이런 정의를 inductive definition 이라 칭하며, 이런 시스템은 inductive structure 라고 한다. 가장 대표적인 예시는 당연히 자연수이다.[16] Co- 로 시작되는것들은 mathematical dual이라 하며, '대비되는 개념'정도로 이해할 수 있다. 예를 들어, data의 dual인 Codata, 재귀(recursion)의 dual인 Corecursion, 귀납의 dual인 Coinduction 등이 있다. dual을 구하는 방법은 그에 대한 정확한 수학적 정의를 논리식으로 풀어서 변환하는 방법이나 Category theory로 정의한 후, arrow의 방향을 바꿔서 얻어지는 경우가 많다.[17] 범주론이 대수학, 위상수학을 넘어 공리적 집합론에 버금가는 중요성을 갖는 수학기초론에 가까운 분야로 대두된 것은 아무리 빨리 잡아도 1960년대였다. 니콜라 부르바키가 현대수학을 집대성할 때에도 범주론을 적극적으로 써먹어야 하느냐 마느냐로 키배가 끊이지 않았던 시절이었으며, 현재도 범주론은 공업수학 같은 속성 코스가 아닌 수학과 학부 고학년생 내지는 대학원생들이 공부하는 고급과정에서나 처음 등판하는 내용이다.[18] Abstraction, intuition, and the “monad tutorial fallacy”워드프레스[19] Facebook's New Spam-Killer Hints at the Future of CodingWIRED[20] Simon Peyton Jones - Haskell is useless유튜브[21] Persistence of Memory워드프레스[출처] [23] Haskellxkcd[24] The Point of Laziness워드프레스[25] Modules Matter Most워드프레스[26] Quick Sort In Haskellc2 위키[27] QuotesPage하스켈 위키[28] Controlling editions and extensionsGHC 깃랩[출처] https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/history.pdf[30] “Haskell Curry? Yes, I dated his daughter.”워드프레스[31] Dijkstra on Haskell and Java[출처] [33] Haskell.org and the Haskell Foundation Join Forces하스켈 블로그[34] Glasgow Haskell Compiler위키백과[35] Haskell 채점환경에 문제가 있는 듯 합니다.백준 자유게시판[36] Thompson-Wheeler logo하스켈 위키

분류