Haskell的基本語法和GHCi


1.注釋

a) --這是一行注釋

b) {-

這是一段注釋

-}

2.表達式

a) 3 :: Float 標示是一個浮點數3,::起到說明類型的作用

b) sort [3,8,1,4] 是一次函數調用。Haskell中的函數調用不需要加括號,多個參數中間也不用加逗號。

c) Case Foo of True -> 1

  False ->2

最后一個表達式的值FooTrue時等於1,否則等於2

值得注意的是:if...then...elsecase...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即可。

NOTEHaskell語言中一旦一個名字被綁定給了表達式(上述”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中,確定的類型首字母大寫(例如FloatBool)代表常亮,而不確定的類型一般都隨意用小寫字母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 --判斷列表中最大/最小的那個

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM