haskell--Learn You a Haskell for Great Good
Table of Contents
1 简单算数
Prelude> 1 + 2 3 Prelude> (1+3)*(2+5) 28 Prelude> 5 * (-2) -10
2 Boolean 代数
Prelude> True && False False Prelude> False || True True Prelude> not False True
3 测试相等
Prelude> "hello" == "hello" True Prelude> "a" /= "b" True Prelude> 1 /= 2 True
4 函数调用(使用内置函数)
不需要括号,括号用来改变优先级
Prelude> succ 100 101 Prelude> succ 1 2 Prelude> min 1 100 1 Prelude> max 1 100 100
5 函数优先级很高(有限结合)
Prelude> succ 5 * 10 * 10 600 Prelude> succ (5 * 10) * 10 510
6 使用反引号的中缀函数
Prelude> div 92 10 9 Prelude> 92 `div` 10 9
7 多次调用同一函数
调用参数只有一个
Prelude> succ (succ 110) 112
8 函数定义
8.1 无参数
size = 123
8.2 带参数
add a b = a + b
8.3 没有顺序要求(前面定义的也可以调用后面的函数)
doubleUs x y = doubleMe x + doubleMe y doubleMe x = x + x
9 列表
9.1 ++ 操作符
λ> [1,2] ++ [1,3] [1,2,1,3] λ> "ab" ++ "12" "ab12"
9.2 :操作符
λ> 'a':"123" "a123" λ> 1:[2,1] [1,2,1]
9.3 列表语法糖(前面的是语法糖)和本质
λ> [1,2,3,4] [1,2,3,4] λ> 1:2:3:4:[] [1,2,3,4]
9.4 取下标对应的数据
λ> "123456" !! 3 '4'
9.5 列表包含列表
列表中的同级元素要相似(如:同级元素是列表且元素都是整数,不能有其他类型)
λ> let a = [[1], [2,3]] λ> a [[1],[2,3]]
9.6 列表比较
默认使用字典比较每一个元素
λ> let a = [10]; λ> let b = [1, 2]; λ> a > b True
10 操作列表的基本函数
10.1 获取第一个元素
λ> head [ 2, 1, 3]
2
10.2 去除首元素
λ> tail [2, 1, 3]
[1,3]
10.3 获取最后一个元素
λ> last [2, 1, 3]
3
10.4 去除最后一个元素
λ> init [2, 1, 3]
[2,1]
10.5 head last init tail 不能作用在空列表上(编译通过,运行发生错误)
λ> head [] ** Exception: Prelude.head: empty list
10.6 列表长度
λ> length [2, 1, 3]
3
10.7 反转列表
λ> reverse [1, 1, 3]
[3,1,1]
10.8 从首元素开始,提取指定个数的元素
λ> let a = [1, 2, 3, 4, 5] λ> take 2 a [1,2] λ> take 8 a [1,2,3,4,5] λ> take 0 a []
10.9 从首元素开始,删除指定个数的元素
λ> let a = [2, 1, 5, 4, 3] λ> drop 3 a [4,3] λ> drop 0 a [2,1,5,4,3] λ> drop 10 a []
10.10 获取可以排序的列表的最大最小值
λ> let a = [1, 3, 2, 5] λ> maximum a 5 λ> minimum a 1
10.11 计算列表的总和和乘积
λ> let a = [0, 1, 2, 3] λ> sum a 6 λ> product a 0 λ> product [2, 3] 6
10.12 判断是否是列表中的元素
λ> let a = [1, 2, 3] λ> 2 `elem` a True λ> 10 `elem` a False
11 ranges
数字和字符序列,也可以使用差值
11.1 简单使用
λ> [1..10] [1,2,3,4,5,6,7,8,9,10] λ> [2,5..20] [2,5,8,11,14,17,20] λ> ['c'..'z'] "cdefghijklmnopqrstuvwxyz" λ> ['c', 'h'..'z'] "chmrw"
11.2 逆序
λ> [10, 8..1] [10,8,6,4,2]
11.3 获取指定个数的两种方式
λ> [10, 20..10 * 10] [10,20,30,40,50,60,70,80,90,100] λ> take 10 [10, 20..] [10,20,30,40,50,60,70,80,90,100]
11.4 获取指定个数循环列表内的元素(列表内的元素无限循环)
λ> take 5 (cycle [1, 2, 3])
[1,2,3,1,2]
11.5 获取指定个数的单个元素的两种方式(推荐用函数的方式)
λ> take 10 (repeat 10) [10,10,10,10,10,10,10,10,10,10] λ> replicate 6 10 [10,10,10,10,10,10]
12 集合
12.1 一个条件
λ> [3*x | x <- [1..7]] [3,6,9,12,15,18,21]
12.2 多个条件
12.3 使用余数
λ> [x | x <- [50..100], x `mod` 7 == 3] [52,59,66,73,80,87,94]
12.4 奇数
是奇数,小于10则xxx,否则xxx
λ> let str set = [if x < 10 then "odd" else "even" | x <- set, odd x] λ> str [6..13] ["odd","odd","even","even"]
12.5 多个列表组合
λ> [x*y|x<-[1..3],y<-[1..3]] [1,2,3,2,4,6,3,6,9]
12.6 计算长度
λ> let len list = sum [1|_<-list] λ> len [1..5] 5 λ> len [1..8] 8
12.7 使用字符串
λ> let filter str = [ch | ch <- str, ch `elem` ['A'..'Z']] λ> filter "Welcome, Hello, World!" "WHW"
12.8 嵌套集合
λ> let xxs = [[1,4..10], [1..10]] λ> [[x|x<-xs, odd x, x > 3] | xs<-xxs] [[7],[5,7,9]]
Created: 2019-12-20 周五 19:25