Haskell类型同义词问题



这给了我以下错误

不在范围:数据构造函数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的构造函数是MyFalseMyTrue,每个构造函数都带有相同的*(无类型参数)。然后,我别名MyBoolBlah

> 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构造函数,两个都处于不同的范围。

相关内容

  • 没有找到相关文章

最新更新