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
构造函数。