2009-12-31 89 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,如果你定义这个就像是一个布尔数据值,那么它的可能性就会小得多,而且错误也会减少。例如,如果有人用(性别'Z')调用函数怎么办?我会建议如下:data Sex =女| |男性派生(...) – codebliss 2009-12-31 07:46:03

+0

@codebliss,谢谢,我忘记了类型的'|'技巧。 (我是*真的* n00bish n00b。) – friedo 2009-12-31 07:52:30

+1

它不是你问的问题,但你会更好地将Sex定义为“data Sex = Male | Female”。 – 2010-01-03 20:10:34

回答

10

问题在于您在记录语法中使用大写字母。该代码应该看起来像:

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

试过,代码似乎至少编译。由于“性别”和“名称”不是类型(而“性别”和“名称”是),所以不能将第一个字母大写。

+0

就是这样,谢谢!我仍然在学习类型构造函数,值构造函数等之间的区别。所有这些对我来说都非常混乱和新鲜。 :) – friedo 2009-12-31 06:07:46

+3

今年夏天我学到了Haskell,这是一次非常有意义的经历。挂在那里! – avpx 2009-12-31 06:10:27

相关问题