Haskell - 基本資料模型



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

在本教程中,我們將使用網站上提供的 Haskell 線上平臺(https://tutorialspoint.tw/codingground.htm)。

數字

Haskell 足夠智慧,可以將某些數字解碼為數字。因此,您無需像在其他程式語言中那樣外部宣告其型別。例如,轉到您的 prelude 命令提示符,執行“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”。

0

字元

與數字一樣,Haskell 可以智慧地識別作為輸入給出的字元。轉到您的 Haskell 命令提示符,並使用雙引號或單引號輸入任何字元。

讓我們提供以下行作為輸入並檢查其輸出。

Prelude> :t "a" 

它將產生以下輸出:

"a" :: [Char] 

請記住,在提供輸入時使用 (:t)。在上面的例子中,(:t) 用於包含與輸入相關的特定型別。我們將在接下來的章節中學習更多關於這種型別的知識。

讓我們來看一個例子,在這個例子中,我們傳遞了一些無效的字元輸入,這導致了錯誤。

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

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

透過錯誤訊息“<interactive>:4:1: Not in scope: `a'”,Haskell 編譯器警告我們它無法識別您的輸入。Haskell 是一種所有內容都用數字表示的語言。

Haskell 遵循傳統的 ASCII 編碼方式。讓我們來看下面的例子以瞭解更多資訊:

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

看看您的輸入是如何被解碼成 ASCII 格式的。

字串

字串只不過是字元的集合。使用字串沒有特定的語法,但 Haskell 遵循使用雙引號表示字串的傳統風格。

讓我們來看一個例子,在這個例子中,我們傳遞字串“Tutorialspoint.com”。

Prelude> :t "tutorialspoint.com" 

它將在螢幕上產生以下輸出:

"tutorialspoint.com" :: [Char] 

看看整個字串是如何被解碼為僅包含 Char 的陣列的。讓我們轉向其他資料型別及其語法。一旦我們開始實際練習,我們就會習慣所有資料型別及其用法。

布林值

布林資料型別與其他資料型別一樣非常簡單。讓我們來看一個例子,我們將使用一些布林輸入(如“True”或“False”)使用不同的布林運算。

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

在上面的例子中,我們不需要提到“True”和“False”是布林值。Haskell 本身可以解碼它並執行相應的操作。讓我們將輸入修改為“true”或“false”。

Prelude> true 

它將產生以下輸出:

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

在上面的例子中,Haskell 無法區分“true”和數字值,因此我們的輸入“true”不是數字。因此,Haskell 編譯器丟擲一個錯誤,指出我們的輸入不在其作用域內。

列表和列表推導

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

與其他資料型別一樣,您不需要將列表宣告為列表。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'

列表推導

列表推導是使用數學表示式生成列表的過程。讓我們來看下面的例子,在這個例子中,我們使用 [output | range ,condition] 格式的數學表示式生成列表。

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]

這種使用數學表示式建立列表的方法稱為列表推導

元組

Haskell 提供了另一種方法來在一個數據型別中宣告多個值。這被稱為元組。元組可以被認為是列表,但是元組和列表之間存在一些技術差異。

元組是不可變的資料型別,我們不能在執行時修改元素的數量,而列表是可變的資料型別。

另一方面,列表是同質的資料型別,而元組是異質的,因為元組可能包含不同型別的資料。

元組由單個括號表示。讓我們來看下面的例子,看看 Haskell 如何處理元組。

Prelude> (1,1,'a') 

它將產生以下輸出:

(1,1,'a') 

在上面的例子中,我們使用了一個包含兩個數字型別變數和一個字元型別變數的元組。

廣告