Haskell入門(一): 邏輯運算,list,tuple等
python入門程式設計, 之後用c++學習資料結構,Haskell萌新。
參考教材 :Learn You a Haskell for Great Good (http://learnyouahaskell.com/)
操作環境 :Ubuntu下Linux64位虛擬機器
Chapter1部分內容
邏輯運算
邏輯值 Boolean value: True, False
邏輯運算子 Boolean operator: &&, ||, not
判斷相等和不等 Equality and inequality: ==, /=
運算優先順序priority () > 函式呼叫function call > 其它數學運算others
If...then...else
Haskell要求有 if 必須有else。
List
Haskell的list類似於c++裡的陣列(array), 必須是相同型別的元素(homogeneous),使用[ ] 包圍。
列表屬性:
length a(list) 獲取元素個數
null a(list) 判斷是否是空list。
元素新增:
a(list) ++ b(list):遍歷a後將b加在尾部。
a(element): b(list) : 將a加在b的開頭。
a(element) `elem` b(list) 判斷a是不是b中的元素。
以上二者中後者在元素多時據說更高效。可能是類似連結串列的結構?
元素獲取:
a(list) !! b(index) 利用下標獲取。從0開始計算下標。python 和 c++裡的[ ]
head a(list) 獲取第一個元素。
tail a(list) 返回除去第一個元素後的list。
last a(list) 獲取最後一個元素。
init a(list) 獲取除去最後一個元素後的list。
take a(int) b(list) 從b中獲取前a個元素組成的list,不足則返回整個list
drop a(int) b(list) 從b中獲取去除前a個元素後餘下的list, 不足則返回空list。
多個list :
小list可以組成大list,但是同樣要求不同list的元素型別相同。
list比較參考字串比較規則。
其它操作:
reverse/sum/product/maximum/minimum a(list) 倒置, 求積, 求和, 求最大元素, 求最小元素
replicate a(element) b(int) 將a重複b次構成list。
cycle a(list), repeat a(element) 獲取由a構成的list
Range
Haskell中,range的表達類似於數學, 使用若干樣例作為模板,使用..表示省略,元素個數可以有限也可以無限。預設模式類似求succ。
range在我的理解裡與python中類似,也是一種iterator物件。考慮到這門語言lazy的性質,只有在需要的時候才會被呈現。這也是為什麼上面的cycle, repeat可以使用(畢竟演算法要求有限性)
另外,這裡的range是前後都閉的。
List Comprehension
Haskell中的list comprehension的用法與Python類似,但是表達上更接近數學中的集合表達。使用|分割元素和條件,使用,分割多個條件, 使用<- 表達屬於。範圍限制條件放在其他條件之前。
Tuple
tuple可以存放型別不同的元素。不同長度或者元素種類不同的tuple都被視為不同的型別,不能放在同一個list中。 tuple使用( ) 包圍。
對於二元組, 可以使用fst 和scd 獲取第一個和第二個元素。