Haskell学习与翻译笔记:List&Tuple
List
语法与性质
- 数列都是同质的(homogenous)
①数列里的元素都是同类型
②[Int] 表示list都是整数类型
③字符串其实是一个list的字符集合
④[[Char]]表示一个list的字符串的集合
l1 :: [Int]
l1 = [1,2,3,4]
l2 :: [[Char]]
l2 = [['a','b','c'], ['d'], []]
- 语法
①数列中元素由’,'分割,被方括号[]包围。
②[]表示空list
数列操作符
- 构建符Construct (:)
运算符(:)是从右向左运算的. 所有的数列都可以看作是从[]开始, 将各元素用(:)附到上面形成的
*Main> True : [False, True]
[True,False,True]
- 连接符 Concatenation ++
即连接两个list
*Main> [True] ++ [False, True]
[True,False,True]
- 同时上述连接符也可以作为函数应用
*Main> (:) True [False, True]
[True,False,True]
*Main> (++) [True] [False, True]
[True,False,True]
一个例子:数列元素相加
sumNums xs
| null xs = 0
| otherwise = head xs + sumNums (tail xs)
*Main> sumNums [1,2,3]
6
其中:
- null – 检测list是否为空
- head – 产生第一个元素为一个新list
- tail – 产生第一个后的其他元素为一个新list
构造等差数列
- [1…5]等于[1,2,3,4,5]
- [‘a’…‘d’]等于[‘a’,‘b’,‘c’,‘d’]
- [2,4…8]等于[2,4,6,8]
常用数列函数
- head --取数列的第一个元素
- last --取数列的最后一个元素
- tail --除去第一个元素剩余的数列
- init --除去最后一个元素剩余的数列
- drop n --除去数列前n个元素剩余的数列
- take n --数列前n个元素
- filter p --把数列中所有满足条件p的元素取出来组成一个数列
- null – 检测list是否为空
- length lst --求数列的元素数目
- reverse lst --将数列中元素次序反过来
- sum lst --对lst中的元素求和
- product lst --lst中的元素连乘
List Comprehension
- 函数可置于List Comprehension的限制条件中
boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]`
ghci> boomBangs [7..13]
["BOOM!","BOOM!","BANG!","BANG!"]
- 多个list中去元素,结果穷尽。一个可以去名词与形容并穷尽所有组合方式的例子。可以用来写诗,哈哈哈。
-ghci> let nouns = ["hobo","frog","pope"]
ghci> let adjectives = ["lazy","grouchy","scheming"]
ghci> [adjective ++ " " ++ noun | adjective <- adjectives, noun <- nouns]
["lazy hobo","lazy frog","lazy pope","grouchy hobo","grouchy frog", "grouchy pope","scheming hobo",
"scheming frog","scheming pope"]
- 若操作含有 List 的 List,使用嵌套的 List comprehension 也是可以的。假设有个包含许多数值的 List 的 List,让我们在不拆开它的前提下除去其中的所有奇数
ghci> let 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与List的不同
- Tuple 中的项不必为同一类型,在 Tuple 里可以存入多态别项的组合。
- List不关心其中包含元素的数量,而Tuple 则要求你对需要组合的数据的数目非常的明确,它的类型取决于其中项的数目与其各自的类型。
操作函数
-
fst 返回一个序对的首项。
-
snd 返回序对的尾项。
Note:这两个函数仅对序对(Pair)有效,而不能应用于三元组,四元组和五元组之上。稍后,我们将过一遍从 Tuple 中取数据的所有方式。 -
zip用来生成一组序对 (Pair) 的 List。它取两个 List,然后将它们交叉配对,形成一组序对的 List。
ghci> zip [1,2,3,4,5] [5,5,5,5,5]
[(1,5),(2,5),(3,5),(4,5),(5,5)]
ghci> zip [1 .. 5] ["one", "two", "three", "four", "five"]
[(1,"one"),(2,"two"),(3,"three"),(4,"four"),(5,"five")]
若是两个不同长度的 List 会怎么样?
ghci> zip [5,3,2,6,2,7,2,5,4,6,6] ["im","a","turtle"]
[(5,"im"),(3,"a"),(2,"turtle")]
由于 Haskell 是惰性的,使用 zip 同时处理有限和无限的 List 也是可以的。
ghci> zip [1..] ["apple", "orange", "cherry", "mango"]
[(1,"apple"),(2,"orange"),(3,"cherry"),(4,"mango")]