Haskell基本資料模型


Haskell是一種純粹的函式式程式設計語言,因此比其他程式設計語言更具互動性和智慧性。在本文章中,我們將學習Haskell的基本資料模型,這些資料模型實際上是預定義的或以某種方式智慧地解碼到計算機記憶體中的。

1. 數位

Haskell足夠聰明,可以將某些數位解碼為數位。因此,無需像在其他程式設計語言中通常那樣在外部指定它的資料型別。如下範例中,進入到命令提示字元,然後執行2 + 2並按Enter鍵,就可以得到結果了。

sh-4.3$ ghci 
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> 2+2

將收到以下輸出結果:

4

在上面的程式碼中,只是將兩個數位作為引數傳遞給GHCI編譯器,但沒有預先定義它們的型別,但是編譯器可以將這兩個資料項解碼為數位。

接下來,嘗試更複雜的數學計算,看看編譯器是否能提供了正確的輸出。嘗試輸入計算表示式:15+(5 * 5)- 40,如下所示:

Prelude> 15+(5*5)-40

上面的表示式按預期輸出結果為:0

2. 字元

與數位一樣,Haskell可以識別輸入的字元。進入到Haskell命令提示字元,然後輸入任何帶雙引號或單引號的字元。
看看以下輸入以及輸出結果。

Prelude> :t "a"

它將產生以下結果:

"a" :: [Char]

請記住,在提供輸入時使用(:t)。在上面的範例中,:t將包括與輸入有關的特定型別。在接下來的章節中詳細了解這種型別。

在下面這個範例中,我們將一些無效輸入作為char傳遞,它將導致錯誤。

Prelude> :t a 
<interactive>:1:1: Not in scope: 'a'  

Prelude> a 
<interactive>:4:1: Not in scope: 'a'

通過錯誤訊息<interactive>:1:1: Not in scope: 'a',Haskell編譯器警告說它無法識別輸入的內容。Haskell是一種語言,所有內容都使用數位表示。
Haskell遵循常規的ASCII編碼樣式。可以看看下面的範例以了解更多資訊-

Prelude> '\97' 
'a'  
Prelude> '\67' 
'C'

3. 字串

字串是字元的集合。使用字串沒有特定的語法,但是Haskell遵循用雙引號表示字串的常規樣式。
看下面的範例,傳遞字串"tw511.com"

Prelude> :t "tw511.com"

執行上面範例程式碼,得到以下結果:

"tw511.com" :: [Char]

了解如何將整個字串解碼為Char陣列。通過另一種資料型別及其語法,當開始實際操作後,你將會習慣於所有資料型別及其使用。

4. 布林型

布林資料型別也非常類似於其他資料型別。在下面的範例中,我們將使用一些布林輸入(例如TrueFalse)使用不同的布林運算。

Prelude> True && True 
True  
Prelude> True && False 
False   
Prelude> True || True 
True  
Prelude> True || False 
True

在上面的範例中,不必說明TrueFalse是布林值。Haskell本身可以對其進行解碼並執行相應的操作。下面修改使用truefalse作為輸入。

Prelude> true

得到以下結果:

<interactive>:9:1: Not in scope: 'true'

在上面的範例中,Haskell無法區分true和數位值,因為輸入true不是數位。所以,Haskell編譯器將引發錯誤,指出輸入不是其作用域。

5. 列表

與其他資料型別一樣,List也是Haskell中使用的非常有用的資料型別。根據範例,[a,b,c]是字元列表,因此,根據定義,List是用逗號分隔的相同資料型別的集合。

與其他資料型別一樣,無需將資料宣告為List。Haskell可以通過檢視表示式中使用的語法來解碼輸入。

下面範例演示Haskell如何處理列表。

Prelude> [1,2,3,4,5]

產生以下結果:

[1,2,3,4,5]

Haskell中的列表本質上是同型別的,因此它們不允許宣告不同資料型別的列表。類似[1,2,3,4,5,a,b,c,d,e,f]這樣的列表會產生錯誤。

Prelude> [1,2,3,4,5,a,b,c,d,e,f]

上面程式碼將產生以下錯誤輸出:

<interactive>:17:12: Not in scope: 'a' 
<interactive>:17:14: Not in scope: 'b' 
<interactive>:17:16: Not in scope: 'c' 
<interactive>:17:18: Not in scope: 'd' 
<interactive>:17:20: Not in scope: 'e' 
<interactive>:17:22: Not in scope: 'f'

列表理解

列表理解是使用數學表示式生成列表的過程。請看下面的範例,在範例中使用數學表示式以[輸出| 範圍,條件]形式。

Prelude> [x*2| x<-[1..10]] 
[2,4,6,8,10,12,14,16,18,20]  
Prelude> [x*2| x<-[1..5]] 
[2,4,6,8,10]  
Prelude> [x| x<-[1..5]] 
[1,2,3,4,5]

這種使用數學表示式建立列表的方法稱為列表理解。

6. 元組

Haskell提供了另一種在單個資料型別中宣告多個值的方法。它被稱為元組(Tuple)。元組可以視為列表,但是元組和列表之間存在一些技術差異。

元組是不可變的資料型別,因為無法在執行時修改元素的數量,而列表是可變的資料型別,列表是同構資料型別,但是Tuple本質上是異構的,因為Tuple可能在其中包含不同型別的資料。
元組由單個括號表示。請看以下範例,以了解Haskell如何處理元組。

Prelude> (1,1,'a')

上面程式將產生以下輸出結果:

(1,1,'a')

在上面的範例中,使用了一個具有兩個數位型別變數和一個char型別變數的元組。