문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 Haskell (문단 편집) === 대수적 데이터 타입 === 대수적 데이터 타입은(Algebraic Data Type, ADT) 하스켈에서 새로운 데이터 타입을 정의하는 방법이다. C의 struct, enum, union 등과 유사하지만, 훨씬 유연한 사용이 가능하다. 다음의 예를 보자. {{{ data Point = Point Int Int data Bool = True | False }}} 위는 정수 순서쌍 {{{Point}}}와 불 타입 {{{Bool}}}[* 대수학에서의 그 불 대수 이다.]을 정의하는 하스켈 코드이다. {{{Point}}}와 {{{Bool}}}은 각각 C에서 {{{struct}}}와 {{{enum}}}을 사용해 구현할 수 있다. 등호 왼쪽에 오는것은 타입의 이름이며, 등호 오른쪽에 오는것은 데이터 생성자이다. 데이터 생성자는 함수의 일종이며, 패턴매칭을 통해서 분해할 수 있다. 위의 예에서 {{{Point}}}타입은 {{{Point :: Int -> Int -> Point}}} 라는 생성자를 가지며, {{{Bool}}}타입은 {{{True :: Bool}}}와 {{{False :: Bool}}}의 두개의 생성자를 가진다. 한편, 하스켈에서 데이터 타입은 다른 데이터 타입을 파라메터로 받는것이 가능하다. {{{ data Maybe a = Nothing | Just a data Either a b = Left a | Right b data Pair a b = Pair a b data List a = Nil | Cons a (List a) }}} Maybe는 nullable한 값을 표현하는 타입으로, Swift등의 {{{Optional}}}타입과 같다. Either와 Pair는 각각 sum type과 product type이라 불리는 것으로, {{{Either}}}는 {{{a, b}}}중 한가지 값만 가질 수 있는 타입을 표현하며, {{{Pair}}}는 {{{a, b}}}의 값을 동시에 가지는 타입을 표현한다. {{{List}}}는 lisp의 리스트 처럼 재귀적으로 정의되는 리스트 자료구조이다. {{{Maybe}}}, {{{Either}}}나 {{{List}}} 타입은 C의 {{{union}}}과 유사한 방식으로 구현 되지만, 한 값을 여러가지 타입으로 다루는 것을 금지하므로 {{{union}}}와 달리 안전하게 사용할 수 있다. {{{Maybe}}}등은 그 자체로는 타입이 아니며, {{{Maybe Bool}}} 처럼 다른 타입을 적용해 타입을 얻을 수 있는데, 이처럼 다른 타입을 인자로 받아 새로운 타입을 만드는 타입을 타입 생성자라고 부르며 이는 타입 레벨 에서의 함수로 생각할 수 있다. 이러한 타입들을 구분짓기 위해서 하스켈은 kind라는 개념을 가지고 있는데, kind는 간단히 말해 타입의 타입이라고 볼 수 있다. 위에서 정의한 타입들은 {{{Bool :: Type}}}, {{{Maybe :: Type -> Type}}}, {{{Either :: Type -> Type -> Type}}} 등의 kind를 가진다. 이것이 끝이 아니라, 다음처럼 타입생성자를 파라메터로 받는 타입도 정의할 수 있다. {{{ data Apply f a = App (f a) }}} {{{Apply :: (Type -> Type) -> Type -> Type}}} 또한 ghc 컴파일러는 이러한 타입시스템을 더욱 유연하게 확장하는 GADT등의 compiler extension을 제공한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기