在Haskell tutorial, 中,我看到了这样的表情
data Vector a = Vector a a a deriving (Show)
可能不一样,但是非常相似。我有点困惑。谁能解释它在做什么?
答案 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
,从而使我们可以忽略细节。如果您还不了解类型类,请不要担心这意味着什么,但是请记住,没有它,您将无法show
或print
这些值。
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]