Haskell类型的同义词问题

use*_*633 3 haskell pattern-synonyms

这给了我以下错误

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

为什么?我以为我可以在任何地方使用类型同义词Person

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

type Blah = Person

person1 :: Blah
person1 = Blah 80 187 
Run Code Online (Sandbox Code Playgroud)

bhe*_*ilr 6

您已将类型别名为Person名称Blah,但构造函数Person仍为Person {weight :: Int, height :: Int}.类型构造函数和类型名称是不同的,甚至保存在Haskell中的不同名称空间中.

举个例子:

> data MyBool = MyFalse | MyTrue deriving (Show, Eq)
> type Blah = MyBool
Run Code Online (Sandbox Code Playgroud)

这里的构造函数MyBoolMyFalseMyTrue,每个都有种类*(没有类型参数).我的别名MyBoolBlah:

> MyTrue :: MyBool
MyTrue
> MyTrue :: Blah
MyTrue
Run Code Online (Sandbox Code Playgroud)

这应该有助于强化这样的想法:虽然类型的构造函数可能与类型本身共享相同的名称,但它们并不相同.