
- Haskell 教程
- Haskell - 首頁
- Haskell - 概述
- Haskell - 環境搭建
- Haskell - 基本資料模型
- Haskell - 基本運算子
- Haskell - 決策
- Haskell - 型別和型別類
- Haskell - 函式
- Haskell - 函式詳解
- Haskell - 函式組合
- Haskell - 模組
- Haskell - 輸入與輸出
- Haskell - Functor
- Haskell - Monad
- Haskell - Zipper
- Haskell 有用資源
- Haskell - 快速指南
- Haskell - 有用資源
- Haskell - 討論
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')
在上面的例子中,我們使用了一個包含兩個數字型別變數和一個字元型別變數的元組。