Проблема с синонимами типа Haskell
Это дает мне следующую ошибку
Не в области: конструктор данных
Blah
Зачем? Я думал, что я могу использовать синоним типа везде, где я могу использовать Person
data Person = Person { weight :: Int, height :: Int }
type Blah = Person
person1 :: Blah
person1 = Blah 80 187
2 ответа
Вы использовали псевдоним типа Person
к названию Blah
, но конструктор для Person
все еще Person {weight :: Int, height :: Int}
, Конструкторы типов и имена типов различаются и даже хранятся в разных пространствах имен в Haskell.
В качестве примера:
> data MyBool = MyFalse | MyTrue deriving (Show, Eq)
> type Blah = MyBool
Здесь конструкторы для MyBool
являются MyFalse
а также MyTrue
каждый с добрым *
(без параметров типа). Я тогда псевдоним MyBool
в Blah
:
> MyTrue :: MyBool
MyTrue
> MyTrue :: Blah
MyTrue
Это должно помочь реализовать идею о том, что, хотя конструктор типа может иметь то же имя, что и сам тип, это не одно и то же.
В самой горячей версии GHC 7.8 вы могли бы написать так:
{-# LANGUAGE PatternSynonyms #-}
data Person = Person { weight :: Int, height :: Int }
type Bar = Person -- type synonym
pattern Baz = Person -- constructor synonym
person1 :: Bar
person1 = Baz 80 187
Но не забывайте Person
это тип и Person
Я - конструктор, и оба находятся в разных сферах.