如果值构造函数也应该是一个类型怎么办?

时间:2011-06-07 23:28:57

标签: haskell

我遇到数据类型的值构造函数也应该是一个类型,例如,如果我有:

data Person = Student {name :: String, age :: Int}
            | Staff {name :: String, salary :: Float} deriving (Show)

我这样误用了:

type St = Student

或 使用学生作为类型的任何地方,例如[Student]也是错误的

我知道我不能这样做,因为Student不是一个类型!那么如何使值构造函数Student可以用作类型?这是不合法的吗?

1 个答案:

答案 0 :(得分:6)

您希望Student成为与PersonStaff不同的类型吗?然后让它们成为不同的类型。

data Person = StudentPerson Student
            | StaffPerson Staff
              deriving (Show)

data Student = Student {name :: String, age :: Int} deriving (Show)
data Staff = Staff {name :: String, salary :: Float} deriving (Show)

他们现在是不同的类型。你可以控制你想要的东西。并且您不会意外地生成部分函数,​​例如agesalary。或者