맨위로가기 타임라인 바로가기

하스켈

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
타임라인 바로가기

1. 개요

하스켈은 1990년에 첫 버전이 발표된 순수 함수형 프로그래밍 언어이다. 미란다를 기반으로 하여 함수형 언어의 표준을 만들고자 하는 논의를 통해 개발되었으며, 하스켈 98, 하스켈 2010 등 여러 버전으로 발전했다. 지연 평가, 타입 추론, 대수적 데이터 타입, 모나드 등의 특징을 가지며, GHC가 주요 구현체로 사용된다. 다양한 분야에서 활용되며, 웹 프레임워크, 증명 보조 도구, 개정 관리 시스템 등에서 사용된다. 하지만 언어의 복잡성과 학습 난이도에 대한 비판도 존재하며, Clean, Agda, Idris 등과 같은 관련 언어들이 개발되었다. 한국에서도 하스켈 커뮤니티가 활동하고 있으나, 산업 현장에서의 활용은 제한적이다.

더 읽어볼만한 페이지

  • 하스켈 프로그래밍 언어 계열 - Agda
    Agda는 찰머스 공과대학교에서 개발된 의존형 타입 이론 기반의 프로그래밍 언어이자 증명 지원 시스템으로, 유니코드 지원, Emacs 모드, 종료 검사, 자동화 기능, 그리고 Haskell 및 JavaScript 컴파일러 백엔드를 제공한다.
  • 1990년 개발된 프로그래밍 언어 - 표준 ML
    표준 ML(SML)은 함수형 프로그래밍 언어이며, 정적 타입 추론, 패턴 매칭, 모듈 시스템 등 다양한 기능을 제공하고, 알고리즘 구현, 표현식 인터프리터, 수치 계산 등 다양한 분야에서 활용된다.
  • 문학적 프로그래밍 - CWEB
    CWEB은 내용 분석이 불가능한 위키백과 문서이며, 정보의 투명성과 접근성 개선이 필요한 상황이다.
  • 문학적 프로그래밍 - 웹 (프로그래밍)
    웹 (프로그래밍)은 C 프로그래밍 언어를 사용하여 소스 코드 작성 과정을 문서화하는 컴퓨터 프로그래밍 시스템으로, CTANGLE과 CWEAVE를 통해 C 코드 생성 및 서식 지정된 문서 생성을 지원하며 TeX 코드 입력, C 코드 서식 지정, 섹션 정의 등의 기능을 제공한다.
하스켈 - [IT 관련 정보]에 관한 문서
개요
Haskell 로고
Haskell 로고
패러다임순수 함수형
발표 연도1990년
설계자레나르트 아우구스손
데이브 바턴
브라이언 부텔
워렌 버튼
조지프 파셀
케빈 해먼드
랄프 힌츠
폴 후닥
존 휴즈
토마스 욘손
마크 존스
사이먼 페이턴 존스
존 런치버리
에리크 메이어르
존 피터슨
앨러스테어 리드
콜린 런시먼
필립 와들러
최신 버전Haskell 2010
최신 버전 출시일2010년 7월
시험 버전 발표Haskell 2020 발표
형 체계추론, 정적, 강한 형
구현체GHC
Hugs
NHC
JHC
Yhc
UHC
방언Gofer
영향을 준 언어Clean
FP
Gofer
Hope 및 Hope+
Id
ISWIM
KRC
Lisp
Miranda
ML 및 Standard ML
Orwell
SASL
Scheme
SISAL
영향을 받은 언어Agda
Bluespec
C++11/Concepts
C#/LINQ
CAL
Cayenne
Clean
Clojure
CoffeeScript
Curry
Elm
Epigram
Escher
F#
Hack
Idris
Isabelle
Java/Generics
LiveScript
Mercury
Ωmega
PureScript
Python
Raku
Rust
Scala
Swift
Visual Basic 9.0
운영 체제크로스 플랫폼
웹사이트Haskell 공식 웹사이트
파일 확장자.hs, .lhs

2. 역사

프로그래밍 언어 하스켈은 논리학과 컴퓨터과학에 지대한 공헌을 한 논리학자 해스켈 커리의 이름을 따서 지어졌다. 원래는 '해스켈'로 불러야 하지만,[118] 대한민국에서는 '하스켈'이라는 이름이 널리 쓰여 굳어졌다.

타입 클래스는 타입 안전한 연산자 오버로딩을 가능하게 하였으며, 필립 와들러와 스티븐 블롯이 1989년에 처음 제안하였다.[30] 초기 버전의 하스켈에서는 사용자 상호 작용과 입출력(IO)이 스트림 기반 및 연속 기반 메커니즘으로 처리되었으나, 이는 불만족스러운 점이 많았다.[31] 버전 1.3에서는 모나드 IO가 도입되었고, 타입 클래스를 고차 타입(타입 생성자)으로 일반화했다. "do 표기법"과 함께, 이는 하스켈에 참조 투명성을 유지하고 편리한 효과 시스템을 제공했다.

초기 버전의 다른 주목할 만한 변경 사항으로는 값 간의 데이터 종속성을 생성하고 게으른 언어에서 과도한 메모리 소비를 피하기 위해 사용되는 'seq' 함수의 접근 방식이 있다. 이는 타입 클래스에서 표준 함수로 이동하여 리팩토링을 더 실용적으로 만들었다.

GHC 7.10 시점의 하스켈 프리루드에서 타입 클래스의 계층 구조


Foldable 및 Traversable의 포함(일부 함수의 타입 시그니처에 대한 해당 변경 사항)과 Functor와 Monad 사이의 중간 단계인 Applicative의 포함은 하스켈 2010 표준에서 벗어난 것이다.

2. 1. 초기 (1985년 ~ 1990년)

1985년 리서치 소프트웨어에서 개발한 미란다는 하스켈의 전신이 되는 함수형 언어이다. 1987년 오리건주 포틀랜드에서 열린 '함수형 프로그래밍 언어와 컴퓨터 구조에 관한 총회'(Functional Programming Languages and Computer Architecture|FPCA '87영어)에서 함수형 언어의 난립을 해소하고 통합된 표준을 만들자는 논의가 시작되었다.[119] 참가자들은 훗날 언어 설계의 기반이 될 수 있는 일반적인 순수 함수형 프로그래밍 언어를 만들자는 데에 뜻을 모았고 위원회가 발족되었다. 1990년 하스켈 1.0 버전이 발표되었다.[120]

2. 2. 하스켈 98 (1997년 ~ 2006년)

1987년 오리건주 포틀랜드에서 열린 ‘함수형 프로그래밍 언어와 컴퓨터 구조에 관한 총회’(FPCA '87)에서 난립하는 함수형 언어들을 통합하고, 훗날 언어 설계의 기반이 될 수 있는 일반적인 순수 함수형 프로그래밍 언어를 만들자는 데에 참가자들의 뜻이 모여 위원회가 발족되었다.[119] 1997년 말, 위원회의 노력으로 다양한 설계안이 나왔고 마침내 ‘하스켈 98’이라는 성과가 나왔다. 하스켈 98은 교육용이나 확장을 덧붙이는 토대로 쓸 수 있는 안정적이고, 작고, 이식성 좋은 언어 표준을 의도한 결과물로서 표준 라이브러리가 포함되어 있었다.[76] 또한 위원회는 하스켈 98에 실험적인 기능을 덧붙이거나 합친 변형, 하스켈 98의 확장 기능이 만들어지는 것을 환영했다.

1999년 1월, 하스켈 98 언어 표준은 《하스켈 98 보고서》(The Haskell 98 Report)라는 이름으로 정식 공개되었다.[76] 2003년 1월에는 《하스켈 98 언어와 라이브러리: 개정 보고서》(Haskell 98 Language and Libraries: The Revised Report)라는 이름으로 개정판이 나왔다.[121]글래스고 하스켈 컴파일러(GHC)’와 ‘허그스’가 하스켈을 실제 컴퓨터로 쓸 수 있게 구현하여 사실상의 표준 역할을 하면서 하스켈은 지금도 끊임없이 발전하고 있다.[32]

2. 3. 하스켈 2010 이후 (2006년 ~ 현재)

2006년 초, 하스켈 98 표준의 후속 버전을 정의하는 과정이 시작되었으며, 이는 비공식적으로 '하스켈 프라임(Haskell′영어)'이라고 불렸다.[33] 이 과정은 언어 정의를 점진적으로 수정하고 매년 새로운 개정판을 발표하는 것을 목표로 했다. 2009년 11월, 첫 번째 개정판인 '하스켈 2010'이 발표되었고,[1] 2010년 7월에 출판되었다.

하스켈 2010은 언어에 대한 점진적인 업데이트로, 이전에는 컴파일러별 플래그를 통해 활성화되었던 몇 가지 널리 사용되고 논란의 여지가 없는 기능들을 통합했다. 주요 변경 사항은 다음과 같다.

  • 계층적 모듈 이름: 모듈 이름은 대문자로 시작하는 식별자를 점으로 구분하여 계층적으로 구성할 수 있게 되었다 (예: `Data.List`).[33]
  • 외부 함수 인터페이스(FFI): 다른 프로그래밍 언어와의 바인딩을 허용한다. C 바인딩이 보고서에 명시되어 있으며, 다른 언어 바인딩도 가능하다.[33]
  • ''n''+''k'' 패턴 금지: `fact (n+1) = (n+1) * fact n` 형식의 정의는 더 이상 허용되지 않는다.[33]
  • 타입 추론 규칙 완화: 더 많은 프로그램이 타입 검사를 통과할 수 있게 되었다.[33]
  • 구문 개선: 패턴 가드 추가, 연산자 우선순위 해결 방식 개선 등.[33]
  • `LANGUAGE` pragma 명시: 2010년까지 널리 사용되던 언어 확장 기능을 지정하기 위해 `LANGUAGE` pragma를 제공한다.[33]

3. 특징

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

수학의 범주론에서 함수의 추상화된 형태인 사상모나드(monad영어)를 차용하여 함수를 명확하게 다룰 수 있다.

2002년을 기준으로 하스켈은 느긋한 계산법을 쓰는 함수형 언어 가운데 가장 활발한 연구가 이루어지는 언어였다. 매사추세츠 공과대학교글래스고 대학교가 개발한 병렬 하스켈, 분산 처리를 강화한 분산 하스켈과 에덴 프로그래밍 언어, 객체 지향 개념을 도입한 하스켈++, 오하스켈, 몬드리안 프로그래밍 언어 등 다양한 변형이 개발되었다.

하스켈과 비슷한 언어로 클린이 있으며, 입출력을 위해 모나드 대신 유일형을 사용한다는 큰 차이점이 있다.

하스켈은 강력하고, 정적 타입 시스템을 기반으로 하며, 힌들리-밀너 타입 추론을 사용한다. 타입 클래스는 오버로딩을 추가하는 방법으로 시작되었지만, 더 많은 용도로 활용된다.

부수 효과를 나타내는 구조는 모나드의 예시이다. 오류 처리, 비결정성, 구문 분석 및 소프트웨어 트랜잭션 메모리와 같은 다양한 계산을 모델링할 수 있다. 하스켈은 모나드의 사용을 위한 구문 설탕을 제공한다.

GHC는 인터프리터이자 네이티브 코드 컴파일러이며, 일반화된 대수적 데이터 타입 및 타입 패밀리와 같은 혁신적인 타입 시스템으로 유명하다. 컴퓨터 언어 벤치마크 게임에서 병행성과 병렬 처리의 고성능 구현을 보여준다.

5,400개 이상의 타사 오픈 소스 라이브러리와 도구가 온라인 패키지 저장소 ''Hackage''에서 제공된다.

오드리 탕의 Pugs영어는 Perl6의 인터프리터컴파일러 구현으로, 하스켈의 유용성을 증명한다. Darcs는 혁신적인 기능을 포함하는 리비전 컨트롤 시스템이며, Linspire Linux는 시스템 툴 개발에 하스켈을 선택했다.

ICFP 프로그래밍 컨테스트에서는 2001년, 2004년, 2005년, 2010년, 2013년, 2014년, 2015년, 2016년에 최우수상을 수상했다.

Cabal은 하스켈용 빌드 및 패키징 시스템이다. Hackage영어를 참조하여 새로운 패키지를 쉽게 설치할 수 있지만, 의존성 지옥이 발생하기 쉬워 이라는 환경도 제공되고 있다.

4. 문법

Haskell의 문법은 수학에서 사용되는 표기법과 매우 유사하다.

"Hello, World!" 프로그램은 다음과 같이 작성한다.

```haskell

module Main (main) where

main :: IO ()

main = putStrLn "Hello, World!"

```

계승을 구현하는 몇 가지 방법은 다음과 같다.



```haskell

fac 0 = 1

fac n = n * fac (n-1)

```

```haskell

fac n = if n > 1 then n * fac (n-1) else 1

```

  • 고차 함수(high-order function)를 이용한 방법


```haskell

fac n = foldl1 (*) [n..1]

```

  • `product` 함수를 이용한 방법 ( `product` 함수는 위의 `foldl1 (*)`와 같다.)


```haskell

fac n = product [n..1]

```

Haskell 특징#예시도 참조

고정점 결합자를 사용하면 명시적인 재귀 없이 함수를 작성할 수 있다.

```haskell

import Data.Function (fix)

factorial = fix fac

where fac f x

| x < 2 = 1

| otherwise = x * f (x - 1)

```

`Integer` 타입은 임의 정밀도를 가지므로, `factorial 100000` (456,574자리의 숫자)과 같은 값을 정밀도 손실 없이 계산할 수 있다.

퀵 정렬과 유사한 알고리즘 구현 (첫 번째 요소를 피벗으로 사용)은 다음과 같다.

```haskell

  • - 리스트 컴프리헨션 사용

quickSort [] = []

quickSort (x:xs) = quickSort [a | a <- xs, a < x]

++ [x] ++

quickSort [a | a <- xs, a >= x]

  • - 필터 사용

quickSort [] = []

quickSort (x:xs) = quickSort (filter (
++ [x] ++

quickSort (filter (>=x) xs)

4. 1. 기본 문법

하스켈의 형 이름은 첫 글자가 대문자여야 한다. 기본적으로 존재하는 단순한 데이터형으로는 `Bool`(부울)형, `Int`(정수)형, `Float`(단정밀도 부동 소수점)형, `Char`(문자)형, `String`(문자열)형 등이 미리 정의되어 있다.[82] 임의의 식의 형을 정의하려면 식과 형 사이에 `::` 기호를 둔다. 변수 등의 심볼을 정의할 때 변수 이름을 식에 지정하여 작성함으로써 해당 변수의 형을 지정할 수 있다.[83] 예를 들어, 다음은 원주율오일러 수를 상수로 정의하고, 또한 그 형을 부동 소수점형으로 지정하고 있다.



pi :: Float

pi = 3.1415926535

e = 2.7182818284 :: Float -- 식 안에서 해당 형을 지정하고 있다



함수의 형은 각 인자 사이를 `->` 기호로 구분하여 표기한다. 함수는 인자를 하나 적용할 때마다 해당 형은 `->`로 구분된 것 중 가장 왼쪽이 사라진 형이 된다고 생각하면 된다.[84] 예를 들어, 두 개의 정수를 인자로 받아 그 최대 공약수를 반환하는 함수 `gcd`의 형은 다음과 같이 정의된다.[85]



gcd :: Int -> Int -> Int -- 함수명 :: 인자1의 형 -> 인자2의 형 -> 반환값의 형



형 변수를 사용하여 형을 추상화할 수도 있다. 이는 C++영어의 템플릿이나 Java영어의 제네릭스에 해당하지만, 다양한 종류(형의 형)에 적용할 수 있으므로 더 유연하다. 예를 들어, `a`형의 값을 받아, 그것을 그대로 반환하는 항등 함수 `id`를 형의 지정과 함께 정의하면 다음과 같다. 여기서 임의의 형을 나타내는 형 이름 `a`가 정의에 사용되었지만, 이처럼 첫 글자가 소문자로 시작하는 형 이름은 구체적인 형 이름이 아닌 형 변수이다. 이 함수는 모든 형의 값을 인자로 받을 수 있다.



id :: a -> a

id x = x



또한, 데이터형은 파라미터로 형 변수를 가질 수 있다. 예를 들어, 스택이나 해시 테이블 등의 데이터형은 해당 요소의 형을 형 변수로 정의한다. 키에 문자열(`String`), 값에 정수(`Int`)를 갖는 해시 테이블 `hashtable`의 형은 다음과 같다.[86]



hashtable :: HashMap String Int



그 외, 특수한 표기를 갖는 형으로 리스트와 튜플, 문자열이 있다. 리스트는 Haskell영어에서 매우 빈번하게 사용되므로, 특별한 구문이 준비되어 있다. 리스트는 요소의 형을 대괄호로 묶는다. 다음은 `Char`(문자)의 리스트를 묶는 변수 `text`의 정의이다.[87] 문자의 리스트는 문자열과 등가이다. 아래 코드의 2행에 있는 것처럼, 문자열은 대부분의 프로그래밍 언어와 마찬가지로 이중 인용 부호로 묶는다. 주석에 Haskell에서의 리스트의 표기를 첨부했다. 마지막으로 디슈가(구문 설탕을 원래 표기로 되돌리는 것)한 리스트의 표기법을 나타냈다. `text`와 `hello`는 동일하다.



text :: [Char]

text = "Hello" -- ['H','e','l','l','o'] 의 구문 설탕

hello :: [Char]

hello = 'H':'e':'l':'l':'o':[]



튜플은 요소의 형을 쉼표로 구분하고, 괄호로 묶는다. 다음은 `Float`(부동 소수점수)의 값을 갖는 2차원 좌표의 튜플이 묶이는 변수 `point`의 정의이다.



point :: (Float,Float)

point = (3, 7)



튜플은 2 이상이면 몇 개라도 요소를 가질 수 있다. 1요소의 튜플은 우선 순위의 괄호와 표기가 충돌하고, 또한 용도가 없으므로 존재하지 않는다. 요소 수가 0인 튜플은 특히 "유닛"(`Unit`)이라고 불리며, 유효한 값을 갖지 않는 등의 경우에 사용된다.[88]

`type` 키워드를 사용하여, 형에 별명을 붙일 수 있다.[89] 다음은 `[Char]`에 `String`이라는 별명을 붙이고 있다.[90]



type String = [Char]

text :: String



Haskell의 형은 '''형 생성자'''(타입 생성자, '''''type constructor''''' )로부터 구축된다.[91] 형 생성자 `T`에 형 변수(Type variables) `v1 v2 vN`을 주고 형식(type expression) `T v1 v2 vN`으로 평가함으로써 형이 구축된다. 형 생성자의 예에는 다음과 같은 것들이 있다.

형 생성자의 분류와 예
카인드총칭출처
*nullary type constructors, type constants`Int`, `Bool`[92]
* -> *unary type constructors`Maybe`, `IO`[93]
* -> * -> *binary type constructors`Either`



예를 들어 형 생성자 `Maybe`에 형 변수 `Int`를 전달하고, `Maybe Int`로 함으로써 형이 구축된다.

함수 이름은 첫 글자가 소문자여야 하며, 기호를 포함할 수 없다. 연산자 이름은 기호만으로 구성되어야 한다. 함수의 정의에서는 C 언어와 같은 인수를 묶는 괄호나 구분 쉼표를 사용하지 않고, 단순히 인수를 공백 문자로 구분하여 표기한다. 다음은 항등 함수 `id` 에, 타입의 정의에 더하여 본체의 정의도 한 예이다.



id :: a -> a

id x = x -- 함수 이름 가인수1 가인수2 … = 함수 본체의 식



함수의 적용도 마찬가지로, 단순히 함수 다음에 공백 문자로 구분한 인수를 나열하면 된다. 다음은 위에서 언급한 항등 함수 `id` 를 적용하여, 다른 변수를 정의한 예이다.



hoge = id "piyo" -- hoge == "piyo" 가 된다.



인수가 항상 2개인 것과 인수 사이에 연산자를 놓는 것을 제외하면, 연산자에 대해서도 함수의 정의나 적용과 마찬가지이다. 표준으로 정의되어 있는 산술 연산자를 사용하여 BMI를 계산하는 함수 `bmi` 를 정의해 본다.



bmi :: Float -> Float -> Float

bmi weight height = weight / height ^ 2



이 정의에서는 `Float` 를 인수로 받아 `Float` 로 결과를 반환하지만, 이 함수에서는 `Double` 을 인수로 사용할 수 없다. 어떤 부동 소수점 타입이라도 다룰 수 있는 함수로 만들려면, 다음과 같이 타입 변수를 사용하면 된다.



bmi :: Floating a => a -> a -> a

bmi weight height = weight / height ^ 2



이 버전의 함수 `bmi` 에서는 인수와 반환값의 타입이 `a` 로 되어 있지만, 여기에 더하여 `a` 는 `Floating` 이라는 제약을 붙이고 있다. `Floating` 은 `Float` 나 `Double` 을 추상화하는 타입 클래스이며 `/` 나 `^` 와 같은 연산자를 적용할 수 있으므로, `bmi` 의 정의에서 이러한 연산자를 사용할 수 있다. 또한, 정수 등의 값은 인수로 취할 수 없고, 반환값은 인수로 주어진 타입으로 반환된다.

함수와 연산자는 새롭게 정의하지 않아도 상호 변환이 가능하다. 함수를 연산자로 사용하려면, 함수를 `` ` `` (백틱)으로 감싼다. 반대로, 연산자를 함수로 사용하려면 괄호로 감싼다. 예를 들어, 정수를 나누는 함수 `div` 는 종종 연산자로 사용된다[94]



aspectRatio = width `div` height



덧붙여, 함수 적용의 우선순위는 모든 연산자 우선순위보다 높다.

4. 2. 주요 기능

하스켈은 지연 평가, 람다 표현식, 패턴 매칭, 리스트 축약, 타입 클래스 및 타입 다형성을 특징으로 한다.[30] 순수 함수형 프로그래밍 언어인 하스켈에서 함수는 일반적으로 부수 효과가 없다. 부수 효과를 나타내기 위한 별개의 구조가 존재하며, 이는 함수 유형에 직교한다. 순수 함수는 다른 언어의 불순 함수를 모델링하여 이후에 실행되는 부수 효과를 반환할 수 있다.

하스켈은 강력하고, 정적인 타입 시스템을 기반으로 하며, 힌들리-밀너 타입 추론을 사용한다. 이 분야의 주요 혁신은 원래 오버로딩을 언어에 추가하는 원칙적인 방법으로 구상되었지만, 그 이후로 더 많은 용도를 찾은 타입 클래스이다.[30]

부수 효과를 나타내는 구조는 모나드의 한 예이다. 모나드는 오류 처리, 비결정성, 구문 분석 및 소프트웨어 트랜잭션 메모리와 같은 다양한 계산을 모델링할 수 있는 일반적인 프레임워크이다. 모나드는 일반적인 데이터 유형으로 정의되지만, 하스켈은 모나드의 사용을 위한 몇 가지 구문 설탕을 제공한다.

  • 지연 평가: 불필요한 계산을 생략하고, 참조 투명성에 의해 동일한 식을 여러 번 평가할 필요가 없어 계산 효율을 높일 수 있다. 다만, 빈번하게 새로운 값을 계산하는 경우에는 엄격 평가가 더 효율적이며, 필요에 따라 `seq` 함수나 BangPatterns 확장을 통해 명시적으로 엄격 평가를 할 수도 있다.
  • 형 추론: 대부분의 경우 형 선언을 생략할 수 있어 간결한 코드 작성이 가능하다.[96]
  • 대수적 데이터 타입: 구조체와 열거체의 성질을 겸비하여 복잡한 데이터를 표현할 수 있다.[98]
  • 무명 함수: `\`(백슬래시)로 시작하며, 고차 함수 정의에 유용하다.
  • 커링과 부분 적용: 함수의 인수를 부분적으로 적용하여 새로운 함수를 만들 수 있다.
  • 패턴 매칭: 함수의 인수를 다양한 패턴으로 받아 처리할 수 있다.
  • 리스트와 리스트 내포 표기: 순서가 있는 여러 값을 다루는 유연하고 간결한 방법을 제공한다.
  • 타입 클래스와 인스턴스: 여러 타입에 공통된 인터페이스를 정의하고, 기존 타입에도 적용할 수 있다.[101]
  • 입출력: 모나드를 통해 부작용을 안전하게 처리한다.[102][103]

5. 구현체


  • 글래스고 하스켈 컴파일러(GHC)는 가장 널리 사용되는 하스켈 컴파일러로, 다양한 프로세서 아키텍처의 네이티브 코드로 컴파일할 수 있다. 또한, C--나 LLVM 같은 중간 언어를 통해 ANSI C로도 컴파일 가능하다.[41][42] GHC는 사실상 표준 하스켈 방언으로 간주되며,[43] OpenGL 바인딩과 같이 GHC에서만 작동하는 라이브러리도 존재한다.
  • Hugs는 하스켈 인터프리터로, 한때 GHC와 함께 가장 많이 사용되었으나 현재는 GHCi로 대체되었다. Hugs는 그래픽 라이브러리를 포함하고 있어 학습용으로 적합하다.
  • 위트레흐트 대학교에서 개발한 Utrecht Haskell Compiler(UHC)는 거의 모든 하스켈 98 기능을 지원하며, 실험적인 확장 기능도 많이 포함하고 있다.[44] 주로 생성된 유형 시스템 및 언어 확장에 대한 연구에 사용된다.
  • Jhc는 생성된 프로그램의 속도와 효율성을 강조하는 하스켈 컴파일러이다. Ajhc는 Jhc의 포크이다.
  • nhc98은 메모리 사용량을 최소화하는 데 중점을 둔 바이트코드 컴파일러이다. York Haskell Compiler(Yhc)는 nhc98의 포크로, 더 간단하고 이식 가능하며 효율적인 것을 목표로 한다.

6. 활용 분야

하스켈은 그 강력함으로 인해 여러 프로젝트에서 활용되고 있다.


  • 아그다: 하스켈로 작성된 증명 보조 도구이다.[45]
  • 카발: 하스켈 라이브러리 및 프로그램의 빌드 및 패키징을 위한 도구이다.[46]
  • 다크스(Darcs): 하스켈로 작성된 개정 관리 시스템으로, 패치 적용을 정밀하게 제어하는 등의 혁신적인 기능을 제공한다.
  • 글래스고 하스켈 컴파일러(GHC): 다른 프로그래밍 언어에서 고급 함수형 프로그래밍 기능 및 최적화를 위한 테스트 베드로도 사용된다.
  • 깃-애넥스(Git-annex): Git 버전 관리 하에서 (대용량) 데이터 파일을 관리하는 도구이다. 분산 파일 동기화 시스템도 제공한다.
  • 린스파이어(Linspire) 리눅스: 시스템 도구 개발을 위해 하스켈을 선택했다.[47]
  • 판독(Pandoc): 하나의 마크업 형식을 다른 형식으로 변환하는 도구이다.
  • 퍼그스: 라쿠 프로그래밍 언어의 컴파일러이자 인터프리터이다.
  • 타이달사이클스(TidalCycles): 하스켈에 내장된 라이브 코딩 음악 패턴을 위한 도메인 특수 언어이다.[48]
  • Xmonad: 하스켈로 완전히 작성된 X 윈도 시스템용 윈도우 매니저이다.[49]
  • GarganText[50]: 모든 웹 브라우저에서 텍스트의 의미론적 분석을 통해 매핑하기 위한 협업 도구로, 하스켈과 퓨어스크립트(PureScript)로 완전히 작성되었으며, 연구 커뮤니티에서 최첨단 보고서 및 로드맵을 작성하는 데 사용된다.[51]
  • Bluespec SystemVerilog(BSV): 전기 공학 설계를 위한 하스켈의 언어 확장이다. 이는 하스켈에 내장된 도메인 특화 언어의 한 예이다. Bluespec, Inc.의 도구는 하스켈로 구현되었다.
  • Cryptol: 암호학 알고리즘을 개발하고 검증하기 위한 언어 및 도구 모음으로, 하스켈로 구현되었다.
  • 페이스북: 스팸 방지 프로그램을 하스켈로 구현했으며,[52] 기본 데이터 액세스 라이브러리를 오픈 소스 소프트웨어로 유지 관리한다.[53]
  • 카르다노 블록체인 플랫폼: 하스켈로 구현되었다.[54]
  • 깃허브: 신뢰할 수 없는 소스 코드의 분석, 차이점 비교 및 해석을 위한 오픈 소스 라이브러리인 Semantic을 하스켈로 구현했다.[55]
  • 스탠다드차타드: 금융 모델링 언어인 Mu는 엄격한 런타임에서 실행되는 하스켈 구문이다.[56]
  • seL4: 최초의 형식적으로 검증된 마이크로커널이며,[57] OS 개발자를 위한 프로토타이핑 언어로 하스켈을 사용했다.[57] 하스켈 코드는 정리 증명 도구에 의한 자동 변환을 위해 추론할 수 있는 실행 가능한 사양을 정의했다.[57] 하스켈 코드는 최종적인 C 정제 이전에 중간 프로토타입 역할을 했다.[57]
  • 타겟 매장: 공급망 최적화 소프트웨어는 하스켈로 작성되었다.[58]
  • Co–Star[59]
  • 머큐리: 백엔드는 하스켈로 작성되었다.[60]


하스켈로 작성된 주요 웹 프레임워크는 다음과 같다.[61]

  • IHP
  • Servant
  • Snap
  • Yesod

7. 비판

하스켈(Haskell)은 다른 프로그래밍 언어에서는 찾아볼 수 없는 많은 기능을 가지고 있지만, 이러한 기능들이 언어를 너무 복잡하게 만든다는 비판을 받는다.[65] 특히, 함수형 프로그래밍 언어와 주류가 아닌 프로그래밍 언어에 대한 비판은 하스켈에도 해당된다.

얀 빌렘 마센(Jan-Willem Maessen)과 사이먼 페이턴 존스(Simon Peyton Jones)는 2002년과 2003년에 각각 게으른 계산(지연 평가)의 이론적 동기를 인정하면서도 이와 관련된 문제점들을 논의했다.[62][63] 이들은 성능 향상과 같은 실질적인 고려 사항 외에도, 게으른 계산이 프로그래머가 코드의 성능(특히 메모리 사용량)에 대해 추론하는 것을 더 어렵게 만든다고 언급했다.[64]

2003년에는 바스티안 헤렌(Bastiaan Heeren), 단 레이엔(Daan Leijen), 아르얀 반 이젠도른(Arjan van IJzendoorn)도 하스켈 학습자들이 겪는 어려움에 주목했다. 이들은 하스켈의 미묘한 구문과 정교한 타입 시스템이 숙련된 프로그래머에게는 유용하지만, 초보자에게는 좌절의 원인이 될 수 있다고 지적했다. 또한, 하스켈의 일반성이 종종 이해하기 어려운 오류 메시지로 이어진다고 보았다.[65] 이러한 오류 메시지 문제를 해결하기 위해 위트레흐트 대학교(Utrecht University)의 연구원들은 헬륨(Helium)이라는 고급 인터프리터를 개발했다. 헬륨은 일부 하스켈 기능의 일반성을 제한하여 오류 메시지의 사용자 친화성을 향상시켰다.[66]

벤 립마이어(Ben Lippmeier)는 게으른 계산에 대한 하스켈의 추론상의 어려움과 가변 배열과 같은 전통적인 데이터 구조의 사용 문제를 해결하기 위해 기본적으로 엄격한 하스켈 방언으로 제자(Disciple)를 설계했다.[67]

로버트 하퍼(Robert Harper)는 Standard ML의 저자 중 한 명으로, 하스켈을 입문 프로그래밍 교육에 사용하지 않는 이유로 엄격하지 않은 계산을 사용하여 자원 사용에 대해 추론하기 어렵다는 점, 게으른 계산이 데이터 타입의 정의와 귀납적 추론을 복잡하게 만든다는 점 등을 제시했다.[69]

하스켈의 빌드 도구인 카발(Cabal)은 역사적으로 동일한 라이브러리의 여러 버전을 제대로 처리하지 못한다는 비판을 받았으며, 이는 "카발 지옥"으로 알려졌다.[71] 스택지 서버(Stackage server)와 스택(Stack) 빌드 도구는 이러한 비판에 대한 대응으로 만들어졌다.

8. 관련 언어

클린은 하스켈과 유사하며, 입출력 처리에 모나드 대신 고유성 타입을 사용한다. Agda는 종속 타입을 가진 함수형 언어이다. Idris는 세인트앤드루스 대학교에서 개발된 종속 타입을 가진 범용 함수형 언어이다. PureScript는 자바스크립트로 컴파일되는 함수형 언어이다. Curry는 하스켈을 기반으로 한 함수형/논리 프로그래밍 언어이다.

참조

[1] 메일링리스트 Announcing Haskell 2010 http://www.haskell.o[...] 2009-11-24
[2] 메일링리스트 ANN: Haskell Prime 2020 committee has formed https://mail.haskell[...] 2016-04-28
[3] 서적
[4] 웹사이트 Dependently Typed Programming in Agda http://www.cse.chalm[...] Chalmers University 2012-02-09
[5] 학술지 Design of Concept Libraries for C++ http://www2.research[...]
[6] 웹사이트 C9 Lectures: Dr. Erik Meijer – Functional Programming Fundamentals, Chapter 1 of 13 http://channel9.msdn[...] Microsoft 2009-10-01
[7] 뉴스 Erik Meijer on LINQ http://www.infoq.com[...] C4Media Inc. 2009-03-04
[8] 뉴스 Clojure Bookshelf https://www.amazon.c[...]
[9] 뉴스 Turn up your nose at Dart and smell the CoffeeScript https://www.infoworl[...] 2011-10-18
[10] 웹사이트 Declarative programming in Escher http://www.cs.bris.a[...] 2015-10-07
[11] 서적 Expert F# "[[Apress]]"
[12] 간행물 Facebook Introduces 'Hack,' the Programming Language of the Future https://www.wired.co[...] 2014-03-20
[13] 웹사이트 Idris, a dependently typed language http://www.idris-lan[...] 2014-10-26
[14] 웹사이트 LiveScript Inspiration http://livescript.ne[...] 2014-02-04
[15] 웹사이트 PureScript by Example https://leanpub.com/[...] Leanpub 2017-04-23
[16] 웹사이트 Functional Programming HOWTO https://docs.python.[...] Python Software Foundation 2012-02-09
[17] 웹사이트 Glossary of Terms and Jargon http://www.perlfound[...] "[[The Perl Foundation]]" 2012-02-09
[18] 웹사이트 Influences - The Rust Reference https://doc.rust-lan[...] 2023-12-31
[19] 웹사이트 MartinOdersky take(5) toList http://blog.fogus.me[...] 2012-02-09
[20] 웹사이트 Chris Lattner's Homepage http://nondot.org/sa[...] Chris Lattner 2014-06-03
[21] 학술지 Confessions of a Used Programming Language Salesman: Getting the Masses Hooked on Haskell
[22] 메일링리스트 anybody can tell me the pronunciation of "haskell"? http://www.haskell.o[...] 2008-01-28
[23] 문서 Type inference originally using [[Type inference#Hindley–Milner type inference algorithm|Hindley-Milner type inference]]
[24] Youtube Edward Kmett – Type Classes vs. the World https://www.youtube.[...]
[25] Citation erkmos/haskell-companies https://github.com/e[...] 2020-06-08
[26] 서적 Real World Haskell: Code You Can Believe In https://books.google[...] "O'Reilly Media, Inc." 2008-11-15
[27] 웹사이트 Haskell in Production: Riskbook https://serokell.io/[...] 2021-09-07
[28] 웹사이트 PYPL PopularitY of Programming Language index http://pypl.github.i[...] 2021-05
[29] 웹사이트 Ranking Programming Languages by GitHub Users https://www.benfrede[...] 2019-09-06
[30] 웹사이트 How to make ad-hoc polymorphism less ad hoc https://www.research[...] 1988-10
[31] 웹사이트 Wearing the hair shirt: a retrospective on Haskell https://www.microsof[...] 2003
[32] 웹사이트 Haskell Wiki: Implementations http://www.haskell.o[...] 2012-12-18
[33] 웹사이트 Welcome to Haskell' https://prime.haskel[...]
[34] 뉴스 GHC 9.2.1 https://downloads.ha[...] GHC 2020 Team 2021-10-29
[35] 문서 Proposed compiler and language changes for GHC and GHC/Haskell https://github.com/g[...]
[36] 서적 Proceedings of the 16th ACM SIGPLAN-SIGACT symposium on Principles of programming languages - POPL '89 ACM
[37] 간행물 Fun with Functional Dependencies, or Types as Values in Static Computations in Haskell http://www.cs.chalme[...] 2001-01
[38] 웹사이트 Computer Language Benchmarks Game https://benchmarksga[...]
[39] 웹사이트 HackageDB statistics http://hackage.haske[...] Hackage.haskell.org 2013-06-26
[40] 문서 "Implementations" at the Haskell Wiki http://www.haskell.o[...]
[41] 웹사이트 The LLVM Backend https://ghc.haskell.[...] 2019-03-29
[42] conference An LLVM Backend for GHC http://www.cse.unsw.[...] ACM Press 2010
[43] 간행물 "Porting HaRe to the GHC API" http://kar.kent.ac.u[...] 2005
[44] 문서 Utrecht Haskell Compiler http://www.cs.uu.nl/[...]
[45] Citation Agda 2 https://github.com/a[...] Agda Github Community 2021-10-15
[46] 웹사이트 The Haskell Cabal https://www.haskell.[...] 2015-04-08
[47] 웹사이트 Linspire/Freespire Core OS Team and Haskell http://urchin.earth.[...] 2006-05
[48] 웹사이트 Live code with Tidal Cycles https://doc.tidalcyc[...] 2022-01-19
[49] 문서 xmonad.org
[50] 웹사이트 Gargantext – Main https://gitlab.iscpi[...] 2023-07-13
[51] report Toward a Research Agenda on Digital Media and Humanity Well-Being https://hal-lara.arc[...] 2023-05-08
[52] 웹사이트 Fighting spam with Haskell https://code.fb.com/[...] 2015-06-26
[53] 웹사이트 Open-sourcing Haxl, a library for Haskell https://code.fb.com/[...] 2014-06-10
[54] 웹사이트 input-output-hk/cardano-node: The core component that is used to participate in a Cardano decentralised blockchain https://github.com/i[...] GitHub null
[55] Citation Parsing, analyzing, and comparing source code across many languages: github/semantic https://github.com/g[...] GitHub 2019-06-07
[56] 웹사이트 Commercial Users of Functional Programming Workshop Report https://anil.recoil.[...] 2022-06-10
[57] conference seL4: Formal verification of an OS kernel http://www.sigops.or[...] 2009-10
[58] 웹사이트 Tikhon Jelvis: Haskell at Target https://www.youtube.[...] 2017-04-22
[59] 웹사이트 Why Co–Star uses Haskell https://www.costaras[...] 2023-09-30
[60] 웹사이트 Haskell in Production: Mercury https://serokell.io/[...] 2024-10-11
[61] 웹사이트 Web/Frameworks – HaskellWiki https://wiki.haskell[...] 2022-09-17
[62] 문서 Eager Haskell: Resource-bounded execution yields efficient iteration Proceedings of the 2002 Association for Computing Machinery (ACM) SIGPLAN workshop on Haskell. 2002
[63] 문서 Wearing the hair shirt: a retrospective on Haskell Invited talk at POPL 2003. 2003
[64] 웹사이트 Lazy evaluation can lead to excellent performance, such as in The Computer Language Benchmarks Game http://www.haskell.o[...] 2006-06-27
[65] 서적 Proceedings of the 2003 ACM SIGPLAN workshop on Haskell
[66] 웹사이트 Helium Compiler Docs https://github.com/H[...] GitHub 2023-06-09
[67] 웹사이트 DDC – HaskellWiki http://www.haskell.o[...] Haskell.org 2010-12-03
[68] thesis Type Inference and Optimisation for an Impure World http://www.cse.unsw.[...] Australian National University 2010
[69] 웹사이트 The point of laziness http://existentialty[...] 2011-04-25
[70] 웹사이트 Modules matter most. http://existentialty[...] 2011-04-16
[71] 웹사이트 Solving Cabal Hell https://www.yesodweb[...] 2019-08-11
[72] 웹사이트 Announcing cabal new-build: Nix-style local builds http://blog.ezyang.c[...] 2019-10-01
[73] URL https://zfoh.ch/ 2024-08
[74] 웹사이트 Hackathon – HaskellWiki http://haskell.org/h[...]
[75] 문서 かつては Goffin と呼ばれていた。
[76] 웹사이트 Preface http://haskell.org/o[...] 2009-06-23
[77] 웹사이트 The History of Haskell http://www.haskell.o[...] 2009-06-23
[78] 웹사이트 Haskell 98 Language and Libraries: The Revised Report http://haskell.org/o[...] 2009-06-23
[79] 웹사이트 Future development of Haskell http://haskell.org/h[...] 2009-06-23
[80] 웹사이트 Welcome to Haskell' http://hackage.haske[...] 2009-06-23
[81] 문서 language-pragma-syntax-extension
[82] 문서 「変数」は実際にはその値を動的に変更することはできないなど、C言語など手続き型言語の変数とは明らかに異なるものである。
[83] 문서 ここでは説明のため単に Float としているが、標準ライブラリで定義されている円周率 pi は浮動小数点数型の抽象的な型クラスである Floating a で定義されており、Float のみならず 倍精度浮動小数点数型 Double の値としても取得できる。
[84] 문서 Haskell はカリー化によりすべての関数を 1 引数の関数として表現できるが、これにしたがって -> は右結合であるとして読むこともできる。上記の関数の型の定義は、括弧を明示した次の定義と同等である。
[85] 문서 式の外で演算子の型を指定するときは、演算子を括弧で囲めばよい。以下の関数と演算子の相互変換を参照のこと。
[86] 문서 これは、C++ や Java のような言語では次のようなコードに相当する。
[87] 문서 当然ながら、リストの要素としてリストを持つこともできる。例えば、文字リスト(文字列)のリストの型は [[Char]] となるであろう。
[88] 문서 ユニットはC言語や Java などでいう void のような使われ方をする。
[89] 문서 言い換えれば、単純な型名に見えても何か複雑な別の型の別名である可能性がある。
[90] 문서 実際に標準ライブラリでは String は [Char] の別名であり、String にはあらゆるリストの操作が可能である。
[91] Haskell2010 type values are built from type constructors. https://www.haskell.[...]
[92] Haskell2010 Char, Int, Integer, Float, Double and Bool are type constants with kind ∗. https://www.haskell.[...]
[93] Haskell2010 Maybe and IO are unary type constructors, and treated as types with kind ∗→∗. https://www.haskell.[...]
[94] 문서 除算する演算子 / は存在するが、これは Float などを除算する演算子であり整数ではない。他の言語のように自動的に値を変換する(int → float など)ような動作は Haskell では意図的に排除されている。
[95] 문서 Haskell の型システムにおける汎用型が実体化されたもの。オブジェクト指向におけるインスタンスとは異なる。
[96] 문서 ただし、型を明示することは可読性を向上したり問題の発見に役立つため、常に省略するのがよいとは限らない。
[97] 문서 java.lang.Integer.parseInt、java.lang.Double.parseDouble など
[98] 문서 algebraic data type
[99] 문서 データ型名とデータコンストラクタ名は同じでも構わない。このような単純な代数的データ型であれば型名とデータコンストラクタ名を同じにすることも多い。
[100] 문서 section
[101] 문서 type class
[102] 문서 action
[103] 문서 GHC には System.IO.Unsafe モジュールに unsafePerformIO という関数があり、副作用を持ちながらアクションでない型を返すことができる。これは参照透過性に対する[[バックドア]]であり、Haskell の参照透過性を破壊する恐れがあるので、注意深く使わなければならない。
[104] 문서 corecursion
[105] URL Haskellの神話 - あどけない話 http://d.hatena.ne.j[...]
[106] 웹사이트 attoparsec: Fast combinator parsing for bytestrings and text http://hackage.haske[...]
[107] 웹사이트 trifecta: A modern parser combinator library with convenient diagnostics http://hackage.haske[...]
[108] 웹사이트 Home — The Glasgow Haskell Compiler https://www.haskell.[...]
[109] 문서 good for equational reasoning
[110] 웹사이트 http://www.cs.chalme[...]
[111] 웹사이트 http://foswiki.cs.uu[...]
[112] 웹사이트 Hugs 98 https://www.haskell.[...]
[113] 웹사이트 jhc http://repetae.net/j[...]
[114] 웹사이트 nhc98 https://www.cs.york.[...]
[115] 웹사이트 Yhc - HaskellWiki https://wiki.haskell[...]
[116] 간행물 A History of Haskell: Being Lazy With Class https://www.microsof[...] 2007-04-16
[117] 메일링 Announcing Haskell 2010 https://mail.haskell[...] 2009-11-24
[118] 메일링 anybody can tell me the pronuncation of "haskell"? https://mail.haskell[...] 2008-01-28
[119] 웹인용 Preface https://www.haskell.[...] 2002-12
[120] 웹인용 The History of Haskell https://web.archive.[...] 2006-09-27
[121] 웹사이트 The Haskell 98 Language Report http://haskell.org/o[...]
[122] 메일링 Linspire/Freespire Core OS Team and Haskell https://web.archive.[...] 2006-05-13

관련 사건 타임라인

( 최근 20개의 뉴스만 표기 됩니다. )



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com