Что, если конструктор значений также должен быть типом?

#haskell

#haskell

Вопрос:

Я на тот случай, если конструктор значений типа данных также должен быть типом, например, если у меня есть:

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

Я неправильно использовал этот способ:

 type St = Student
  

или
все, что использует Student в качестве типа, например [Student] , тоже неверно

Я знаю, что не могу этого сделать, потому что Student это не тип! Тогда как сделать так, чтобы конструктор значений Student можно было использовать как тип? Это запрещено законом?

Комментарии:

1. Я немного сбит с толку. Вы хотите, чтобы это был тип, отличный от Person , или синоним типа для Person , или что?

2. Почему бы не написать ‘data Person = Person ..’ и ‘type Student = Person’?

3. Я просто хочу, чтобы Student можно было использовать как своего рода тип. но это все еще своего рода Person .

4. @Jakob Runge Мой плохой пример. Что, если Student это всего лишь один из конструкторов значений Person ?

Ответ №1:

Итак, вы хотите, Student чтобы это был тип, отличный от Person и Staff ? Тогда сделайте их разными типами.

 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)
  

Теперь это разные типы. Вы можете управлять тем, что хотите. И вы также не случайно генерируете частичные функции, подобные age и salary в вашем случае.

Комментарии:

1. Этот дополнительный уровень ( StudentPerson ) действительно помогает, хотя и добавляет немного больше типов.