Haskell型同义词问题

Haskell型同义词问题,haskell,pattern-synonyms,Haskell,Pattern Synonyms,这给了我以下的错误 不在范围内:数据构造函数Blah 为什么??我想我可以在任何可以使用Person data Person = Person { weight :: Int, height :: Int } type Blah = Person person1 :: Blah person1 = Blah 80 187 您已经将类型Person化名为Blah,但是Person的构造函数仍然是Person{weight::Int,height::Int}。类型构造函数和类型名是不同的,甚

这给了我以下的错误

不在范围内:数据构造函数
Blah

为什么??我想我可以在任何可以使用
Person

data Person = Person { weight :: Int, height :: Int }

type Blah = Person

person1 :: Blah
person1 = Blah 80 187 

您已经将类型
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
是一个构造函数,两者都在不同的范围内。

Blah
Person
类型的别名,而不是
Person
构造函数。