类型构造函数å¯ä»¥ä¸Žå€¼æž„造函数相åŒå—?

时间: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,从而使我们å¯ä»¥å¿½ç•¥ç»†èŠ‚。如果您还ä¸äº†è§£ç±»åž‹ç±»ï¼Œè¯·ä¸è¦æ‹…心这æ„味ç€ä»€ä¹ˆï¼Œä½†æ˜¯è¯·è®°ä½ï¼Œæ²¡æœ‰å®ƒï¼Œæ‚¨å°†æ— æ³•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]