1.注釋
a) --這是一行注釋
b) {-
這是一段注釋
-}
2.表達式
a) 3 :: Float 標示是一個浮點數3,::起到說明類型的作用
b) sort [3,8,1,4] 是一次函數調用。Haskell中的函數調用不需要加括號,多個參數中間也不用加逗號。
c) Case Foo of True -> 1
False ->2
最后一個表達式的值在Foo是True時等於1,否則等於2。
值得注意的是:if...then...else和case...of...這些語句雖然在其他語言中作為控制結構的聲明,在Haskell中大部分都是表達式。
d) 表達式就是有值的式子,Haskell和大多數編程語言一樣,程序中包含表達式和聲明兩種;
3.聲明
a) Haskell是一門強類型語言,所有表達式都有確定的類型,::可以用來手動標注類型
b) 綁定
addOne :: Int -> Int
addOne x = x +1
Welcome :: String
Welcone = “hello world”
上面語句中:welcome :: String 讀作welcome的類型是String,=則是把右側的表達式綁定在左側的名稱上了,在代碼其余地方,每當想要用”hello world”時使用wecome即可。
NOTE:在Haskell語言中一旦一個名字被綁定給了表達式(上述”hello world”也是表達式),這個名稱包含的表達式就永遠不會再變了,Haskell中不存在變量的概念,只存在綁定,任何時刻一個名稱對應的表達式都是唯一確定的。
上述addOne 是一個函數綁定,與第二個不同,判斷方法是=后有多個名稱。
c) 作用域
X = 1
Let x = 2
In y = x --此處y == 2
Z = x --此處z ==1
d) 導入
Haskell會默認在所在模塊導入一個叫Prelude的模塊函數,包含了許多基本的函數(例如print)。Haskell中的許多重要模塊(包括prelude)一起構成了base庫,這套base庫會隨着Haskell編譯器一起發行。所以只有有可以工作的GHC,就可以直接導入base中的所有模塊
e) 牢記:
Haskell中沒有變量和賦值,只有綁定,且一旦綁定不能改變
Haskell中沒有條件、循環、分支等控制聲明,條件和分支在Haskell中是表達式的一部分
4.函數
a) 函數分為普通函數和中綴函數兩種。普通函數的調用方法就是函數跟上參數,中綴函數和算式中的加減乘除差不多:先寫一個參數,再寫函數,最后再跟上一個參數
想要把一個普通函數當成中綴函數使用,需要在函數兩邊加上``(注意是鍵盤左上角``,不是‘’)
想要把中綴函數當成普通函數使用,需要在中綴函數兩邊加上括號
Eg.
elem 3 [1,2,3]
--elem x xs 判斷列表xs中是否出現了x
3 `elem` [1,2,3]
--普通函數以中綴函數的形式調用
Eg.
(+) 1.5 1.5
--等價於1.5 + 1.5
b) ::是類型說明函數,優先級最低
5.GHCi
a) GHCi身處在一個連續的運算過程中,后面的綁定可以覆蓋前面的綁定,暫時記得在GHCi中綁定名稱時,一定要在前面加上let就好:let xs = [2,3,4,5]
b) 在Haskell中,確定的類型首字母大寫(例如Float和Bool)代表常亮,而不確定的類型一般都隨意用小寫字母a,b,c。。。表示,代表類型變量。當然也可以用小寫字母開頭的單詞表示類型變量。
c) 查詢中綴函數&& 的信息:
:info && 或 :t (&&)
d) 綁定中綴函數的方法:(以++++做平方和為例)
(++++) :: Int -> Int -> Int
x ++++ y = x^2 + y^2
或者
(++++) :: Int -> Int -> Int
(++++) x y = x^2 + y^2
但是在GHCi中必須加上let才能使
e) 一些初級函數:
!! :: [a] -> Int -> a
--取列表第n個元素(從0開始)
[1,3,4] !! 2
--3
head :: [a] -> a
tail :: [a] -> [a]
--取列表頭和尾
init :: [a] -> [a]
last :: [a] ->a
--取列表始和末
null :: [a] -> Bool
--判斷列表是否為空
length :: [a] -> length
求列表長度
Take 2 [1,2,3,4,5]
--[1,2]
--取列表前N個元素
reverse :: [a] -> [a]
--顛倒一個列表
elem ,notElem 判斷元素是否在列表中
min,max --判斷兩個元素中最大/最小的那個
minmum,maxmum --判斷列表中最大/最小的那個