對Discrete Mathematics Using a Computer的第一章Introduction to Haskell進行總結。環境Windowsexpress
函數毫無疑問是函數式語言的核心。app
在Haskell中(無特殊指明,如下皆是指在Haskell下),一個表達式用函數完成計算被稱爲a function application,函數後加空格而後跟隨參數(arguments),若有多個參數,也以空格做爲分隔。函數
函數的返回值即函數的類型,如一個函數的參數是類型a,返回值是類型b,寫做a → b(在Haskell中用 -> 表示),讀做a arrow b。spa
操做符其實也是函數,它有2個參數,寫在2個參數中間,其實也能夠像正常函數同樣寫在前面,但須要加( )如:code
一樣的,也能夠像對待操做符同樣將函數放在2個參數中間,但要加反引號( single-back-quote, ` ),如:blog
將函數定義在Haskell腳本文件(.hs)中,載入(在ghci中 :load)後,便可使用。three
函數的聲明:ci
function_name :: argType1 -> argType2 -> ... ->argTypen ->resultTypeit
函數體:io
function_name arg1 arg2 ... argn = expression that can use the arguments
模式匹配pattern matching
在定義函數時,爲應對不一樣狀況,能夠有多個函數體,如:
f :: Integer -> String f 1 = "one" f 2 = "two" f 3 = "three"
在獲得參數執行時,會從第一條開始比較是否符合,當遇到符合的纔會執行,執行後即該函數執行完成,若是沒有符合的會報錯,如:
元組和list均可以做爲函數參數,其中list有兩種形式:1. [1,2,3, x ]的形式,用以表示list中有具體個數 2. x:xs 3. xs (能夠用其餘字母代替,若是一個叫x,它所在的list通常叫xs)。
練習題:
個人答案:
exercise3 :: Char -> Bool exercise3 'a' = True exercise3 x = False exercise4 :: String -> Bool exercise4 "hello" = True exercise4 x = False exercise5 :: String -> String exercise5 (' ':xs) = xs exercise5 xs = xs
另外一種應對多種值的方法:guards。即便用bool表達式判斷是否符合條件,符合則執行該行。
fact :: Integer -> Integer fact n | n < 0 = 0 | n == 0 = 1 | otherwise = n * fact (n - 1)
高階函數higher order functions
參數和返回值都是正常的數據類型則該函數是一階函數(first order)。以別的函數做爲參數或者以其餘函數做爲返回結果則是高階函數(higher order)。如:
twice :: (a -> a) -> a -> a twice f x = f (f x)
函數是一次接收一個函數進行處理的,好比一個須要2個參數的函數 ,若是隻給出第一個參數,那麼返回的是一個須要一個參數來完成原函數的新函數(partial application)。
prod :: Integer -> Integer ->Integer prod x y = x * y g = prod 4 p = g 6 q = twice g 3
條件表達式conditional expressions
樣式:
if Boolean_expression then exp1 else exp2 --then和else都必需要有,exp1和exp2的type同樣。
局部變量local variables: let Expressions
當某個固定式子被屢次使用時,爲了方即可以定義爲局部變量。
樣式:
let equation
equation
...
equation
in expression
上式的值爲in後的expression。以求一元二次方程程序爲例,要注意Tab縮進:
quadratic :: Double -> Double -> Double -> (Double, Double) quadratic a b c = let d = sqrt (b^2 - 4 * a * c) x1 = (-b + d) / (2 * a) x2 = (-b -d) / (2 * a) in (x1, x2)
要注意從let到in expression,其總體就是一個表達式,以下所示:
let x = sqrt 9 in (x + 1) * (x - 1)的值爲8.0(x的值爲3.0),因此2 + let x = sqrt 9 in (x + 1) * (x - 1)的值爲10.0。
局部變量local variables: where
另外一種表達局部變量做爲helper是where。如:
maximum :: [Int] -> Int
maximum [x] = x
maximum (x:xs)
| x > maxxs = x
| otherwise = maxxs
where maxxs = maximum xs
類型變量type variables
相似與Java中的泛型generics,在定義函數時不明確其類型,在應用時,根據傳入參數的類型肯定,這樣就只要定義一個函數就能夠應對多種不一樣類型,而不用爲了類型不一樣,一一重複定義函數,體現了其多態性,在以前的例子中也有沒有指明其類型而是用字母代替的,好比
fst :: (a, b) -> a snd :: (a, b) -> b
類型變量必須以小寫字母開頭,一般用a,b...