Проблема с синонимами типа 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 Я - конструктор, и оба находятся в разных сферах.

Другие вопросы по тегам