Haskell
使用data
宣告全新的type
與type declaration只是宣告一個「關於既存類型的同義詞」不同,使用data
關鍵字可以宣告全新的類型。
在Prelude中,Bool
類型即是以下列方式宣告的:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33data Bool = True | False
```
- 在``=``左邊的稱為 type constructor (上例中的``Bool``)
- 在``=``右邊的稱為 data constructor 或 value constructor (上例中的``True`` 或 ``False``)
## 使用 type parameter 的時機
> We usually use type parameters when the type that's contained inside the data type's various value constructors isn't really that important for the type to work
f
> 名詞定義:
> concrete types, fully applied type: 像是 ``Maybe Int``, ``Maybe Char``
> 至於``Maybe``本身只是一個**type constructor**,並非具體的type。任何值都必須具有concrete type。
> 比較 ``Maybe`` 和 ``Maybe Int``:``Maybe``是一個type constructor,``Maybe Int``則是一個 concrete type
## 好好區分 type constructor 和 data constructor
type constructor只能出現在下面用``...``表示的幾個地方:
- ``data ... =``
- ``type ... =``
- ``::...``
- ``instance Eq ... where``
# 使用``type``為現存的type宣告新的別名
稱為 type synonym。用來給一個既有type提供一個別名。什麼時候需要這樣大費周章為已經存在的type提供新的名稱?
> We introduce type synonyms either to describe what some existing type represents in our functions (and thus our type declarations become better documentation) or when something has a long-ish type that's repeated a lot (like ``[(String,String)]``) but represents something more specific in the context of our functions.
> [LYAH](http://learnyouahaskell.com/making-our-own-types-and-typeclasses)
``Char``是一個Haskell本身就定義好的type,如果要以``Char``為基礎,建立新的type,那麼就要使用``type``:
type String = [Char]1
2
``Int``也是一個Haskell本身就有的、用以表達整數的type,如果想建立一個正整數座標的Point type,並包在tuple中,可以使用:
type Point = (Int, Int)1
2
3
4
當然,定義好新的type之後,新的type就可以用在別的type宣告中。
也許有一系列的function都與「將一個Point轉換到另一個Point」有關,因此可以為這群函數宣告一個新的type:
type Transformation = Point -> Point1
2
## Type synonym也可以具有type parameters
type Pair a = (a, a)`
一個Pair可以是Pair Int (Int, Int),可能是(Char, Char)