内涵列表
如下
[x * 2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]
假设现在只想要 x * 2 大于等于12的元素,需要添加谓词,如下
[x * 2 | x <- [1..10], x * 2 >= 12]
[12,14,16,18,20]
使用谓词从list中删除元素也称为filtering过滤
假设现在将列表中大于10的奇数替换为"BANG",小于10的奇数替换为"BOOM",如果不是奇数则过滤掉,如下
boomBangs xs = [if x > 10 then "BANG" else "BOOM" | x <- xs, odd x]
如果传递的是奇数,odd函数返回True;如果传递的是偶数,则返回False
只有当所有谓词都求值为True时,元素才包含在list中
boomBangs [7..13]
["BOOM", "BOOM", "BANG", "BANG"]
不仅可以在一个内涵列表中有多个谓词(一个元素必须满足列表中包含的所有谓词),而且还可以从多个list中提取元素,生成这些list的所有可能组合,如下
[x * y | x <- [2,5,10], y <- [8,10,11]]
一个内涵列表从两个长度为3的list中提取元素,只要不过滤它们,它的长度将为9个元素
[16,20,22,40,50,55,80,100,110]
下划线_
下划线意味着不关心要从list中提取什么,所以不写一个永远不会使用的变量名,而是简单地写_,如下
length' xs = sum [1 | _ <- xs]
处理字符串
由于字符串是list,所以可以使用内涵列表来处理和生成字符串
一个接受字符串并删除除大写字母以外的所有内容的函数,如下
removeNoUpper xs = [x | x <- xs, x `elem` ['A'..'Z']]
内嵌内涵列表
如果使用嵌套的list,则可以创建嵌套的内涵列表
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]]
一个接受嵌套列表并删除奇数的函数,如下
removeOdd xxs = [[x | x <- xs, even x] | xs <-xxs]
如果传递的是偶数,even函数会返回True;如果传递的是奇数,则返回False