内涵列表 intensional list

发布时间 2023-04-01 02:49:30作者: 牧羊龟

内涵列表

如下

[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