数学中的集合有两种表达形式,分别是
列举法{1,2,3,4,5}
描述法{x|x<=5}
一般的编程语言只支持了列举法,支持描述法的寥寥无几,不过haskell就是其中的一种(python的列表推导算半个)
接下来用描述法来表示一些集合
[x*2 | x <- [1..10]]
#相当于[2,4,6,8,10,12,14,16,18,20]
[x*2 | x <- [1..10], x*2 >= 12]
#相当于[12,14,16,18,20]
因为对一组数据进行处理几乎是所有编程任务中最常见的几个,所以haskell特殊的描述法可以使非常多在一般编程语言里需要不停嵌套循环才能实现的任务,变的十分简单。
即使是对比一些流式函数式框架,例如java8的stream,rx函数式系列。haskell的列表描述法几乎也是代码量最少的。
举一些例子
#它能够使 List 中所有大于 10 的奇数变为 "BANG",小于 10 的奇数变为 "BOOM"
#haskell里控制语句也是表达式 例如if
boomBangs xs = [ if x < 10 then "BOOM!" else "BANG!" | x <- xs, odd x]
boomBangs [7..13]
#输出为 ["BOOM!","BOOM!","BANG!","BANG!"]
[ x*y | x <- [2,5,10], y <- [8,10,11]]
#输出[16,20,22,40,50,55,80,100,110]
[ x*y | x <-[2,5,10], y <- [8,10,11], x*y > 50]
#输出[55,80,100,110]
#求集合长度 _是占位符
length' xs = sum [1 | _ <- xs]
#返回一个集合 保留大写
removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']]
#嵌套
[ [ x | x <- xs, even x ] | xs <- xxs]
欢迎关注我的github https://github.com/luckyCatMiao