系列文章
- 《Haskell趣學指南》筆記之基本語法
- 《Haskell趣學指南》筆記之型別(type)
- 《Haskell趣學指南》筆記之函式
- 《Haskell趣學指南》筆記之高階函式
- 《Haskell趣學指南》筆記之模組
- 《Haskell趣學指南》筆記之自定義型別
前言
- Haskell 是純函式式的(不能賦值,引用透明)
- Haskell 是 lazy 的
- Haskell 是靜態型別的
- Haskell 支援型別推導
:l myfunctions
可以載入同目錄的 myfunctions.hs,且可以重複執行:set prompt "ghci> "
可以改 prompt:set prompt "λ "
可以得到 λ- 把這句話寫在 ~/.ghci 裡試試
- putStrLn 可以列印出中文字串
第 1 章
5 * -3
要寫成5 * (-3)
,不然報錯- 布林用 True 和 False
1 + '1'
會報錯,5 + 0.4
不報錯,因為 5 也可以被看作 5.0
函式
- Haskell 中有一些中綴函式,如 * 和 +
- 只要以特殊字元命名函式,即可自動將它視為中綴函式。
- Haskell 大部分屬於字首函式,如
succ 8
是取後繼min 1 2
是取最小max 1 2
是取最大div 9 3
是除法
- 函式呼叫的優先順序最高,
succ 9 * 10
等價與(succ 9) * 10
- 字尾可以變中綴:
div 9 3
可以改成9 `div` 3
- 單引數函式
doubleMe x = x + x
- 雙引數函式
doubleUs x y = x * 2 + y * 2
- 函式定義沒有先後順序的概念
- 條件語句
if <condition> then <exp> else <exp>
不能省略 else - 條件語句是表示式而不是語句,總是有返回值
- 函式名可以包含
'
字元,一般以'
結尾的函式是非惰性求值版本,也叫嚴格求值 - 函式名不能以大寫字母開頭,因為大寫字母開頭的是型別
- 沒有引數的函式被稱為定義或者名字,如
a = 1
列表
- 列表是單型別 homogeneous 的資料結構,只能儲存型別相同的元素,不能儲存型別不同的元素
a = [1,2,3]
- 使用
++
可以拼接兩個列表,但是它會遍歷第一個列表 "hello"
是['h','e','l','l','o']
的語法糖- 使用 Cons 運算子
:
可以在列表頭部插入一個元素1:[2,3]
[1,2]
是1:2:[]
的語法糖- 按索引獲取值可以用
!!
符號:[1,2,3] !! 0
值為 1,索引越界會報錯 [3, 2, 1] > [2, 1, 0]
值為 True- 更多列表操作:
head/tail/last/init/length/null/reverse/task 3/drop 3/maximum/minimum/sum/product求積
head []
報錯4 `elem` [3,4,5]
值為 True[1..20]
生成 1 到 20 這 20 個數字組成的列表['a'..'z']
/['K'..'Z']
[2,4..20]
生成 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20][20..1]
會得到空列表,應該寫成[20,19..1]
take 24 [13, 26..]
cycle [1, 2, 3]
會對列表進行無限迴圈,得到 1,2,3,1,2,3,1,2,3... 組成的列表repeat 5
會得到由 5 組成的無限列表repeat 3 10
會得到 [10,10,10]
列表推導式
[x* 2 | x <- [1.. 10]]
得到 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20][x* 2 | x <- [1.. 10], x>5, filter2, filter3]
可以對 x 進行過濾[ x* y | x <-[1, 3, 5], y <- [2, 4, 6]]
得到長度為 9 的列表 [2,4,6,6,12,18,10,20,30][ x* y | x <-[1, 3, 5], y <- [2, 4, 6], x* y > 10]
得到 [12,18,20,30]length' xs = sum [1 | _ <- xs]
可以使用這個 length' 函式求列表的長度- 還能巢狀:
ghci> xxs = [[1, 3, 5, 2, 3, 1, 2, 4, 5],[ 1, 2, 3, 4, 5, 6, 7, 8, 9],[ 1, 2, 4, 2, 1, 6, 3, 1, 3, 2, 3, 6]] ghci> [ [ x | x <- xs, even x ] | xs <- xxs] [[2, 2, 4],[ 2, 4, 6, 8],[ 2, 4, 2, 6, 2, 6]] 複製程式碼
元組 tuple
- tuple 可以容納不同型別的值,也就是說它是異構的
- tuple 的長度是固定的,不能改變
(1,3)
是 tuple,(1,'a', "hello")
也是 tuple- 長度為 2 的元組也叫序對 pair
- 二元組和三元組的型別被視為不同,所以
[(1,2), (3,4,5)]
會報錯,因為列表只能包含相同型別的東西 - 長度相同,但是裡面元素的型別如果不同,兩個 tuple 的型別也會被視為不同
- 不允許長度為 1 的元組,因為這沒有意思
- 序對相關 API
- fst (8,11) => 8
- snd (8,11) => 11
- zip [1,2,3] [4,5,6] => [(1,4),(2,5),(3,6)]
- 如果 zip 的兩個引數的長度不同,那麼就會捨棄多餘的項