一句話介紹:Haskell 是一門純粹的函數(shù)式編程語言瞪慧。
安裝Haskell
需要一個(gè) Haskell 編譯器社痛。目前來說最流行的 Haskell 的編譯器是 Glasgow Haskell Compiler(GHC),我使用的就是這樣一個(gè)編譯器掀抹。
一般來說持舆,我們會(huì)安裝 Haskell Platform样勃,因?yàn)樗粌H包含了 Haskell 編譯器,還綁定了一下常用的庫嗦董。Haskell 的官方網(wǎng)站是:http://www.haskell.org/母谎。 不管是 Windows 版本、Linux 版本京革、Unix 版本都有奇唤。
我使用的是 Ubuntu 系統(tǒng),使用 apt-get 安裝其實(shí)很簡單,只需要一條命令就好啦:
sudo apt-get install haskell-platform
GHC 不但可以編譯 Haskell 腳本(.hs文件)匹摇,也可以以交互式方式運(yùn)行咬扇。要啟動(dòng)交互模式,在終端中輸入:
ghci
這時(shí)廊勃,中斷會(huì)輸出一些信息:
GHCi, version 7.4.1: 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>
如果在 Haskell 文件
中定義了一些函數(shù)懈贺,可以在 GHC 交互式解析器中輸入:
:l myFunctions
來載入你定義的函數(shù)。 l
是 load 的首字母供搀。
基本算數(shù)操作
算數(shù)操作基本上和 Java 等其他語言都比較類似隅居,直接舉幾個(gè)例子:
Prelude> 2 + 3
5
Prelude> 2 * 3
6
Prelude> 2 - 3
-1
Prelude> 2 / 3
0.6666666666666666
需要特別注意的事情是,在使用負(fù)數(shù)的時(shí)候葛虐,最好是使用括號(hào)胎源,舉個(gè)例子:
Prelude> 2 * -3
<interactive>:7:1:
Precedence parsing error
cannot mix `*' [infixl 7] and prefix `-' [infixl 6] in the same infix expression
布爾代數(shù)
Haskell 的與、或屿脐、非其實(shí)也很直接涕蚤,直接看例子:
Prelude> True && False
False
Prelude> True && True
True
Prelude> True || False
True
Prelude> not False
True
判斷是否相等、是否不等:
Prelude> 2 == 3
False
Prelude> 2 /= 3
True
實(shí)際上盡管我們沒有提過函數(shù)的诵,但是其實(shí)已經(jīng)用到了函數(shù)万栅,*
運(yùn)算實(shí)際上是一個(gè)函數(shù),它接收兩個(gè)參數(shù)西疤,上面那種形式叫做中綴函數(shù)烦粒,但是實(shí)際上大部分函數(shù)是以前綴函數(shù)的形式調(diào)用的,下面介紹幾個(gè):
Prelude> succ 8
9
Prelude> max 7 8
8
Prelude> min 8 9
8
Prelude> div 9 2
4
函數(shù)需要注意的
這幾個(gè)函數(shù)的作用非常明顯。但是需要注意的是 div 函數(shù)其實(shí)等價(jià)于 Java 語言中的 /
運(yùn)算符扰她,小數(shù)部分是舍棄的兽掰。上面的函數(shù)我們也可以以中綴函數(shù)的形式調(diào)用,比如:
Prelude> 9 `div` 2
4
我們可以定義自己的函數(shù)徒役,函數(shù)定義的格式如下:
函數(shù)名 = 函數(shù)代碼
我們新建一個(gè) .hs
文件孽尽,在其中定義一個(gè)函數(shù):
doubleMe x = x * 2
在交互式解析器中輸入 :l file.hs
加載你所定義的函數(shù),這時(shí)忧勿,解析器會(huì)輸出如下信息:
Prelude> :l baby.hs
[1 of 1] Compiling Main ( baby.hs, interpreted )
Ok, modules loaded: Main.
*Main>
接下來就可以使用你所定義的函數(shù)了:
*Main> doubleMe 2
4
在定義別的函數(shù)的時(shí)候可以使用已經(jīng)定義的函數(shù)杉女,例如:
doubleUs x y = x * 2 + y * 2
Haskell 中也有 if 表達(dá)式,但是與 Java 語言的 if 表達(dá)式有一些區(qū)別鸳吸,我們先看一個(gè)例子:
doubleSmallNumber x = if x > 100 then x else x * 2
這個(gè)函數(shù)的意思是熏挎,如果一個(gè)數(shù)小于等于 100,就翻倍层释,否則保持不變婆瓜。但是需要注意的是,Haskell中的 else 部分是必須有的贡羔。此外還需要注意的是廉白,Haskell 函數(shù)名的首字母必須小寫。
如果函數(shù)沒有參數(shù)乖寒,那么這樣的函數(shù)在 Haskell 中叫做定義或者名稱猴蹂。這一點(diǎn)有點(diǎn)類似于 Java 中的變量,但是有非常重要的區(qū)別:Haskell 中的定義一旦給出就不允許改變楣嘁。
List概述
Haskell 中的 List 是一種比較均勻整齊的數(shù)據(jù)結(jié)構(gòu)磅轻,之所以說它均勻整齊是因?yàn)槠渲械脑乇仨毷?strong>相同類型的。List 是被方括號(hào)包裹起來的:
*Main> let nums = [1,2,3,4]
*Main> nums
[1,2,3,4]
在 GHCi 中需要使用 let
來定義一個(gè) List逐虚。List 有很多操作聋溜,下面分別介紹。
- List連接操作
使用 ++
來連接兩個(gè) List:
*Main> nums ++ [5,6]
[1,2,3,4,5,6]
在 Haskell 中叭爱,字符串實(shí)際上就是列表撮躁,也可以使用 ++
進(jìn)行連接操作:
*Main> "Hello," ++ " " ++ "World!"
"Hello, World!"
可以使用 :
操作符將一個(gè)元素放到一個(gè)列表最前面:
*Main> 0 : [1,2,3]
[0,1,2,3]
可以使用 !!
使用索引訪問 List 中的元素:
*Main> [1,2,3,4] !! 3
4
索引號(hào)是從 0 開始的。
- List 比較大小
List 比較大小的前提是 List 元素是可以比較的买雾,比如說數(shù)字把曼,比如說字母(按照字母表順序)。比較的規(guī)則是以此比較每一個(gè)元素直到出現(xiàn)不同的元素漓穿,那第一個(gè)不同元素嗤军,元素大的 List 大:
*Main> [1,2,3] < [1,2,4]
True
*Main> [1,2,3] < [1,2,3]
False
*Main> [1,2,3] < [1,2,2]
False
- 其他List操作
函數(shù) | 說明 |
---|---|
head | 可以取出List的首元素 |
tail | 將List去掉首元素 |
last | 返回List的末尾元 |
init | 返回除最后一個(gè)元素之前的所有元素構(gòu)成的 List |
length | 返回元素個(gè)數(shù) |
null | 判斷 List 是否為空列表 |
take n [...] | 從列表中取出 n 個(gè)元素 |
drop n [...] | 忽略 n 個(gè)元素后返回 List |
maximum/minimum | 取出最大/最小值 |
sum | 所有元素求和 |
product | 所有元素乘積 |
elem | 判斷元素是否在列表中 |
reverse | List 倒置 |
*Main> head [1,2,3]
1
*Main> tail [1,2,3]
[2,3]
*Main> last [1,2,3]
3
*Main> init [1,2,3]
[1,2]
*Main> take 3 [1,2,3,4,5,6]
[1,2,3]
*Main> drop 3 [1,2,3,4,5,6]
[4,5,6]
*Main> length [1,2,3]
3
*Main> null []
True
*Main> reverse [1,2,3]
[3,2,1]
*Main> maximum [1,2,3]
3
*Main> minimum [1,2,3]
1
*Main> sum [1,2,3]
6
*Main> product [1,2,3]
6
*Main> 4 `elem` [1,2,3,5]
False
根據(jù)來源 整理為 Markdown 格式。
把為知筆記轉(zhuǎn)移到簡書上來, 做一個(gè)筆記的分類晃危。