Haskell系列(四)列表推导式和元组

324 阅读1分钟

列表推导式

  • [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)],生成一组序对 (Pair) 的 List
      • 如果 zip 的两个参数的长度不同,那么就会舍弃多余的项