#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
) действительно помогает, хотя и добавляет немного больше типов.