这给了我以下错误
不在范围:数据构造函数
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
ia构造函数,两个都处于不同的范围。