《Haskell趣學指南》筆記之基本語法

系列文章bash


前言

  • Haskell 是純函數式的(不能賦值,引用透明)
  • Haskell 是 lazy 的
  • Haskell 是靜態類型的
  • Haskell 支持類型推導
  • :l myfunctions 能夠加載同目錄的 myfunctions.hs,且能夠重複執行
  • :set prompt "ghci> " 能夠改 prompt
    • :set prompt "λ " 能夠獲得 λ
    • 把這句話寫在 ~/.ghci 裏試試
  • putStrLn 能夠打印出中文字符串

第 1 章

  • 5 * -3 要寫成 5 * (-3),否則報錯
  • 布爾用 True 和 False
  • 1 + '1' 會報錯,5 + 0.4 不報錯,由於 5 也能夠被看做 5.0

函數

  • Haskell 中有一些中綴函數,如 * 和 +
    • 只要以特殊字符命名函數,便可自動將它視爲中綴函數。
  • Haskell 大部分屬於前綴函數,如
    • succ 8 是取後繼
    • min 1 2 是取最小
    • max 1 2 是取最大
    • div 9 3 是除法
  • 函數調用的優先級最高,succ 9 * 10 等價與 (succ 9) * 10
  • 前綴能夠變中綴:div 9 3 能夠改爲 9 `div` 3
  • 單參數函數 doubleMe x = x + x
  • 雙參數函數 doubleUs x y = x * 2 + y * 2
  • 函數定義沒有前後順序的概念
  • 條件語句 if <condition> then <exp> else <exp> 不能省略 else
  • 條件語句是表達式而不是語句,老是有返回值
  • 函數名能夠包含 ' 字符,通常以 ' 結尾的函數是非惰性求值版本,也叫嚴格求值
  • 函數名不能以大寫字母開頭,由於大寫字母開頭的是類型
  • 沒有參數的函數被稱爲定義或者名字,如 a = 1

列表

  • 列表是單類型 homogeneous 的數據結構,只能存儲類型相同的元素,不能儲存類型不一樣的元素
  • a = [1,2,3]
  • 使用 ++ 能夠拼接兩個列表,可是它會遍歷第一個列表
  • "hello"['h','e','l','l','o'] 的語法糖
  • 使用 Cons 運算符 : 能夠在列表頭部插入一個元素 1:[2,3]
  • [1,2]1:2:[] 的語法糖
  • 按索引獲取值能夠用 !! 符號:[1,2,3] !! 0 值爲 1,索引越界會報錯
  • [3, 2, 1] > [2, 1, 0] 值爲 True
  • 更多列表操做:head/tail/last/init/length/null/reverse/task 3/drop 3/maximum/minimum/sum/product求積
  • head [] 報錯
  • 4 `elem` [3,4,5] 值爲 True
  • [1..20] 生成 1 到 20 這 20 個數字組成的列表
  • ['a'..'z'] / ['K'..'Z']
  • [2,4..20] 生成 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
  • [20..1] 會獲得空列表,應該寫成 [20,19..1]
  • take 24 [13, 26..]
  • cycle [1, 2, 3] 會對列表進行無限循環,獲得 1,2,3,1,2,3,1,2,3... 組成的列表
  • repeat 5 會獲得由 5 組成的無限列表
  • repeat 3 10 會獲得 [10,10,10]

列表推導式

  • [x* 2 | x <- [1.. 10]] 獲得 [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
  • [x* 2 | x <- [1.. 10], x>5, filter2, filter3] 能夠對 x 進行過濾
  • [ x* y | x <-[1, 3, 5], y <- [2, 4, 6]] 獲得長度爲 9 的列表 [2,4,6,6,12,18,10,20,30]
  • [ x* y | x <-[1, 3, 5], y <- [2, 4, 6], x* y > 10] 獲得 [12,18,20,30]
  • length' xs = sum [1 | _ <- xs] 能夠使用這個 length' 函數求列表的長度
  • 還能嵌套:
    ghci> xxs = [[1, 3, 5, 2, 3, 1, 2, 4, 5],[ 1, 2, 3, 4, 5, 6, 7, 8, 9],[ 1, 2, 4, 2, 1, 6, 3, 1, 3, 2, 3, 6]]
    ghci> [ [ x | x <- xs, even x ] | xs <- xxs]
    [[2, 2, 4],[ 2, 4, 6, 8],[ 2, 4, 2, 6, 2, 6]]
    複製代碼

元組 tuple

  • tuple 能夠容納不一樣類型的值,也就是說它是異構的
  • tuple 的長度是固定的,不能改變
  • (1,3) 是 tuple,(1,'a', "hello") 也是 tuple
  • 長度爲 2 的元組也叫序對 pair
  • 二元組和三元組的類型被視爲不一樣,因此 [(1,2), (3,4,5)] 會報錯,由於列表只能包含相同類型的東西
  • 長度相同,可是裏面元素的類型若是不一樣,兩個 tuple 的類型也會被視爲不一樣
  • 不容許長度爲 1 的元組,由於這沒有意思
  • 序對相關 API
    • fst (8,11) => 8
    • snd (8,11) => 11
    • zip [1,2,3] [4,5,6] => [(1,4),(2,5),(3,6)]
      • 若是 zip 的兩個參數的長度不一樣,那麼就會捨棄多餘的項
相關文章
相關標籤/搜索