这给了我以下错误
不在范围内:数据构造函数
Blah
为什么?我以为我可以在任何我可以使用的地方使用类型同义词Person
data Person = Person { weight :: Int, height :: Int }
type Blah = Person
person1 :: Blah
person1 = Blah 80 187
这给了我以下错误
不在范围内:数据构造函数
Blah
为什么?我以为我可以在任何我可以使用的地方使用类型同义词Person
data Person = Person { weight :: Int, height :: Int }
type Blah = Person
person1 :: Blah
person1 = Blah 80 187
您已将类型别名为Person
name Blah
,但构造函数Person
仍然是Person {weight :: Int, height :: Int}
。类型构造函数和类型名称是不同的,甚至在 Haskell 中保存在不同的命名空间中。
举个例子:
> data MyBool = MyFalse | MyTrue deriving (Show, Eq)
> type Blah = MyBool
这里的构造函数MyBool
是MyFalse
and 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
is 一个类型和Person
ia 一个构造函数,两者都在不同的范围内。