2009-12-31 3 views
1

Я пытаюсь создать тип «Человек», где у каждого человека есть секс и имя.Почему эта декларация типа не работает?

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, если бы вы определили это так, как если бы вы использовали значение данных boolean, то есть гораздо меньше возможностей и меньше ошибок. Например, что, если кто-то вызвал функцию с (Sex «Z»)? Я бы предложил следующее: данные Пол = Женский | Мужской вывод (...) – codebliss

+0

@codebliss, спасибо, я забыл о '' 'трюке для типов. (Я на самом деле * n00bish n00b.) – friedo

+1

Его не вопрос, который вы задали, но вы бы лучше определили Секс как «данные Секс = Мужской | Женский». –

ответ

10

Проблема заключается в использовании верхнего регистра внутри синтаксиса записи. Код должен выглядеть так:

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

Попытка, чтобы код, казалось бы, скомпилирован. Поскольку «секс» и «имя» не являются типами (в то время как «Секс» и «Имя»), вы не можете сделать первые буквы в верхнем регистре.

+0

Вот и все, спасибо! Я все еще изучаю разницу между конструкторами типов, конструкторами значений и т. Д. Все очень запутанно и ново для меня. :) – friedo

+3

Я узнал Haskell этим летом, и это был очень полезный опыт. Повесить там! – avpx