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遵循用雙引號表示字串的常規樣式。
看下麵的示例,傳遞字串"xuhuhu.com"

Prelude> :t "xuhuhu.com"

執行上面示例代碼,得到以下結果:

"xuhuhu.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類型變數的元組。