2009-12-31 9 views
1

나는 각각의 사람이 섹스와 이름을 가진 'Person'유형을 만들려고합니다.이 형식 선언이 작동하지 않는 이유는 무엇입니까?

data Sex = Sex Char deriving Show 

male = Sex 'M' 
female = Sex 'F' 

data Name = Name [Char]  deriving Show 

data Person = Person { 
    Sex :: Sex, 
    Name :: Name 
} deriving (Show) 

내가 ghci이를로드 할 때 난 그냥 내가 잘못 여기서 뭐하는 거지 무슨 도움이되지 않는 오류 parse error on input 'Sex'

를 얻을?

+1

임의의 PS로, 부울 데이터 값처럼이 값을 정의하면 훨씬 적은 가능성과 버그가 줄어 듭니다. 예를 들어 누군가가 (Sex 'Z')와 함께 함수를 호출하면 어떨까요? 나는 다음을 제안 할 것이다 : data Sex = Female | 남성 파생 (...) – codebliss

+0

@codebliss, 감사합니다. 유형에 대한 트릭을 잊어 버렸습니다. (나는 정말로 * n00bish n00b입니다.) – friedo

+1

당신이 물어 본 질문이 아니지만 "데이터 섹스 = 남성 | 여성"으로 섹스를 정의하는 것이 더 낫습니다. –

답변

10

문제는 레코드 구문 내에서 대문자 사용에 있습니다. 코드는 다음과 같아야합니다 :

data Person = Person { sex :: Sex, name :: Name }... 

적어도 코드는 컴파일하는 것 같습니다. "sex"와 "name"은 유형이 아니기 때문에 ("Sex"와 "Name"은있는 반면), 첫 글자를 대문자로 만들 수 없습니다.

+0

그게 다예요, 고마워요! 나는 여전히 타입 생성자, 값 생성자 등의 차이점을 배우고 있습니다. 매우 혼란스럽고 새로운 것입니다. :) – friedo

+3

이번 여름에 하스켈을 배웠고, 매우 보람있는 경험이었습니다. 거기에 매달려! – avpx

관련 문제