Haskell学习笔记:List

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")]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值