A의 data
선언하는 형식의 생성자는 등호 기호의 왼쪽에있는 것입니다. 데이터 생성자 (들)은 등호 (=)의 오른쪽에있는 것들입니다. 형식이 예상되는 곳에 형식 생성자를 사용하고 값이 예상되는 곳에 데이터 생성자를 사용합니다.
데이터 생성자
간단하게하기 위해 색상을 나타내는 유형의 예부터 시작할 수 있습니다.
data Colour = Red | Green | Blue
여기에는 세 개의 데이터 생성자가 있습니다. Colour
유형이고 Green
유형 값을 포함하는 생성자입니다 Colour
. 비슷하게,Red
및 Blue
은 유형 값을 생성하는 두 생성자입니다 Colour
. 우리는 그것을 spicing하는 것을 상상할 수 있습니다!
data Colour = RGB Int Int Int
우리는 여전히 타입 만 가지고 Colour
있지만 RGB
값은 아닙니다. 그것은 3 개의 Int를 받고 반환 하는 함수입니다. 값을 하는 ! RGB
유형이 있습니다
RGB :: Int -> Int -> Int -> Colour
RGB
일부 값 을 인수로 취한 다음이를 사용하여 새 값을 생성하는 함수 인 데이터 생성자입니다 . 객체 지향 프로그래밍을 수행했다면이를 인식해야합니다. OOP에서 생성자는 일부 값을 인수로 취하고 새 값을 반환합니다!
이 경우 신청하면 RGB
세 개의 값에 하면 색상 값을 얻습니다!
Prelude> RGB 12 92 27
#0c5c1b
우리는 유형 의 값 을 구성했습니다.Colour
데이터 생성자를 적용하여. 데이터 생성자는 변수와 같은 값을 포함하거나 다른 값을 인수로 사용하여 새 값을 만듭니다 . 이전 프로그래밍을 해본 적이 있다면이 개념이별로 이상하지 않을 것입니다.
중지
String
s 를 저장하기 위해 이진 트리를 구성 하려면 다음과 같은 작업을 수행하는 것을 상상할 수 있습니다.
data SBTree = Leaf String
| Branch String SBTree SBTree
여기에서 볼 수있는 것은 SBTree
두 개의 데이터 생성자를 포함 하는 유형 입니다. 즉, 값을 구성하는 두 개의 함수 (즉 Leaf
및 Branch
)가 있습니다.SBTree
유형의 있습니다. 바이너리 트리가 작동하는 방식에 익숙하지 않다면 그냥 거기에 머 무르십시오. 실제로 바이너리 트리가 어떻게 작동하는지 알 필요는 없습니다. 단지이 트리 String
가 어떤 방식으로 s를 저장한다는 것입니다.
우리는 또한 두 데이터 생성자가 String
인수를받는 것을 볼 수 있습니다. 이것은 트리에 저장할 문자열입니다.
그러나! 을 저장할 수 있기를 원한다면 Bool
새로운 바이너리 트리를 만들어야합니다. 다음과 같이 보일 수 있습니다.
data BBTree = Leaf Bool
| Branch Bool BBTree BBTree
유형 생성자
SBTree
및 둘 다 BBTree
형식 생성자입니다. 그러나 눈에 띄는 문제가 있습니다. 그들이 얼마나 비슷한 지 보십니까? 그것은 당신이 정말로 어딘가에 매개 변수를 원한다는 신호입니다.
그래서 우리는 이것을 할 수 있습니다 :
data BTree a = Leaf a
| Branch a (BTree a) (BTree a)
이제 유형 생성자에 매개 변수 a
로 유형 변수 를 소개합니다 . 이 선언에서 BTree
함수가되었습니다. 인수로 유형 을 취하고 새로운 유형을 반환합니다 .
여기서는 프로그램의 값에 할당 할 수있는 유형 인 구체적인 유형 (예 Int
: [Char]
및 포함 ) 과 유형 을 공급해야하는 유형 생성자 함수 의 차이점을 고려하는 것이 중요 합니다. 값에 할당됩니다. 그것은 "목록 할 필요가 있기 때문에 값, 유형"목록 "이 될 수 없다 무엇인가 ". 같은 정신으로 값은 " 무언가를 저장하는 이진 트리"여야하므로 "이진 트리"유형이 될 수 없습니다 .Maybe Bool
예를 Bool
들어에 인수로 전달하면 s 를 저장하는 이진 트리 인 BTree
유형을 반환합니다 . 유형 변수의 모든 발생을 교체 유형과를 , 그리고 사실 어떻게 자신을 위해 볼 수 있습니다.BTree Bool
Bool
a
Bool
원하는 경우 종류BTree
와 함께 함수로 볼 수 있습니다.
BTree :: * -> *
종류는 유형과 다소 유사합니다. *
는 콘크리트 유형을 나타내므로 BTree
콘크리트 유형에서 콘크리트 유형까지입니다.
마무리
여기로 잠시 뒤로 물러나서 유사점에 주목하십시오.
매개 변수가있는 데이터 생성자는 값에 약간의 변화를 원할 경우 멋집니다. 이러한 변수를 매개 변수에 넣고 값을 생성하는 사람이 어떤 인수를 넣을지 결정하게합니다. 같은 의미에서 매개 변수가있는 유형 생성자는 멋집니다. 우리 유형의 약간의 변형을 원한다면! 우리는 이러한 변형을 매개 변수로 입력하고 유형을 생성하는 사람이 어떤 인수를 넣을지 결정하도록합니다.
사례 연구
여기에서 홈 스트레치로 Maybe a
유형을 고려할 수 있습니다 . 그 정의는
data Maybe a = Nothing
| Just a
다음 Maybe
은 구체적인 유형을 반환하는 유형 생성자입니다. Just
값을 반환하는 데이터 생성자입니다. Nothing
값을 포함하는 데이터 생성자입니다. 우리의 유형을 보면 Just
, 우리는 볼
Just :: a -> Maybe a
즉, Just
유형 값을 취하고 유형 값을 a
반환합니다 Maybe a
. 우리의 종류를 보면 Maybe
, 우리는 볼
Maybe :: * -> *
즉, Maybe
구체적인 유형을 취하고 구체적인 유형을 반환합니다.
다시 한번! 구체적인 유형과 유형 생성자 함수의 차이점. Maybe
s 목록을 만들 수 없습니다. 실행하려고하면
[] :: [Maybe]
오류가 발생합니다. 그러나 Maybe Int
, 또는 의 목록을 만들 수 있습니다 Maybe a
. Maybe
유형 생성자 함수 이기 때문 입니다. 그러나 목록에는 구체적인 유형의 값이 포함되어야합니다. Maybe Int
그리고 Maybe a
구체적인 유형은 (또는 통화 구체적인 형태를 돌려 생성자 함수를 입력합니다.)
Car
형식 생성자 (의 왼쪽에 있음=
)와 데이터 생성자 (오른쪽에 있음) 모두 이므로 약간 혼란 스러울 수 있습니다 . 첫 번째 예제에서Car
형식 생성자는 인수를받지 않고 두 번째 예제에서는 3 개를 사용합니다. 두 예제 모두에서Car
데이터 생성자는 세 개의 인수를 사용합니다 (하지만 이러한 인수의 유형은 한 경우에는 고정되고 다른 경우에는 매개 변수화됩니다).