3

这给了我以下错误

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

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

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

type Blah = Person

person1 :: Blah
person1 = Blah 80 187 
4

2 回答 2

6

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

举个例子:

> data MyBool = MyFalse | MyTrue deriving (Show, Eq)
> type Blah = MyBool

这里的构造函数MyBoolMyFalseand MyTrue,每个都有种类*(没有类型参数)。然后我别名MyBoolBlah

> MyTrue :: MyBool
MyTrue
> MyTrue :: Blah
MyTrue

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

于 2014-02-05T19:55:47.450 回答
2

在最热门的 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

但可以肯定的是,不要忘记Personis 一个类型和Personia 一个构造函数,两者都在不同的范围内。

于 2014-02-05T22:11:26.783 回答