类型构造函数可以与值构造函数相同吗?

时间:2018-07-20 17:48:57

标签: haskell types

Haskell tutorial, 中,我看到了这样的表情

data Vector a = Vector a a a deriving (Show)

可能不一样,但是非常相似。我有点困惑。谁能解释它在做什么?

2 个答案:

答案 0 :(得分:3)

data Vector a = MkVector a a a 

为任何类型Vector a定义参数化数据类型a

它还定义了一种创建该类型值的方法:通过使用具有三个相同类型参数的数据构造函数MkVector

对于任何类型a,用三个类型MkVector的值调用a都会产生类型Vector a的值。例如,

let a :: Int ; a = 1 ; v = MkVector a 3 4 in v :: Vector Int

let a :: Float ; a = 1 ; v = MkVector a 3 4 in v :: Vector Float

碰巧的是,我们也被允许使用与Vector类型相同的名称作为数据构造函数的名称。起初这可能会造成混淆。

答案 1 :(得分:1)

这定义了一个名为Vector的新数据类型。让我们将其分解为几个不同的部分:

data Vector a     -- Type part
  = Vector a a a  -- Constructor part
  deriving (Show) -- Automatic derivation part

类型部分说:“以下内容将被定义为类型Vector a,其中a是一些未知类型”:

data Vector a     -- Type part

构造器部分定义一个函数Vector :: a -> a -> a -> Vector a。请注意,类型和值具有不同的名称空间,因此可以具有相同的名称。

  = Vector a a a  -- Constructor part

自动派生部分告诉编译器自动为此类型实现函数show,从而使我们可以忽略细节。如果您还不了解类型类,请不要担心这意味着什么,但是请记住,没有它,您将无法showprint这些值。

  deriving (Show) -- Automatic derivation part

我们可以在GHCi中使用这些值:

λ> data Vector a = Vector a a a deriving (Show)
λ> Vector 1 2 3
Vector 1 2 3
λ> :type Vector True False True
Vector True False True :: Vector Bool
λ> :type Vector "Hello," " World" "!"
Vector "Hello," " World" "!" :: Vector [Char]
相关问题