2015-01-14 6 views
2

하스켈을 배우며 this example으로 혼란 스럽습니다.유형의 값 대 값 생성자

는 다음과 같은 고려 : FrankTofu의 인스턴스를 만들 때 왜 그

class Tofu t where 
    tofu :: j a -> t a j 

data Frank a b = Frank {frankField :: b a} deriving (Show) 

instance Tofu Frank where 
    tofu x = Frank x 

, 우리는 (지금까지 내가 이해) 제공, 타입 생성자 Frank x 대신 값 생성자, 즉 tofu x = Frank {frankField = x} ?

답변

6

당신은 여전히 ​​값 생성자를 사용하고 있습니다. 레코드 구문을 사용하지 않고 레코드 필드가있는 형식을 사용할 수 있으므로 Frank xFrank { frankField = x }과 동일한 작업을 수행합니다. 당신이있는 경우

하나 개 이상의 레코드 필드, 예를 들면 :

-- With x :: a, y :: b 
Frank x y 
+1

아 :

data Frank a b = Frank { frankA :: a, frankB :: b } 
이 ... 다음 필드는 당신이 할 수 있도록, 그들을 쓴 순서대로 표시 ! 타입과 값 생성자가 모두 Frank라는 이름으로 혼란 스러웠다 고 생각합니다. 고맙습니다! – d125q

+3

예, 조금 혼란 스러울 수 있습니다. 형식 서명/클래스 선언/etc에 CapitalizedIdentifier가있는 경우 유형 이름이 될 것이고 다른 곳에서는 생성자가 될 것이라는 점을 기억하십시오. – porges

+1

@ d125q보다 구체적으로, 유형 이름은 값 생성자 이름 및 함수/값 이름과 동일한 네임 스페이스를 공유하지 않습니다. – bheklilr