本博客所有内容是原创,未经书面许可,严禁任何形式的转载。
http://blog.csdn.net/u010255642
8、集合
集合由元素组成,每个元素属于集合,或者说集合包含这个元素,设a为元素,S为集合,记为m∈S,集合含有有限个元素,便称为有穷集合,否则称为无穷集合。
Haskell中可以使用列表机制支持集合的概念
1)集合定义
我们使用下面的方式定义集合:
[组成元素的变量|变量范围,约束条件]
如:
Prelude> let myset=[x|x<-[2,4..16]]
Prelude> myset
Prelude> let myset=[x|x<-[2,4..16],x `mod` 4 ==0]
Prelude> myset
[4,8,12,16]
[2,4,6,8,10,12,14,16]
Prelude> let myset=[x|x<-[2,4..16],x `mod` 4 /=0]
Prelude> myset
[2,6,10,14]
Prelude>
下面这个列表,对于小于8的奇数返回平方,大于或等于8的奇数,直接返回本身
Prelude> let myset=[x|x<-[1..16]]
Prelude> let myset1=[if x >8 then x else x*x |x<-myset,x `mod` 2 /=0]
Prelude> myset1
[1,9,25,49,9,11,13,15]
Prelude>
2)笛卡尔积
我们使用2个或以上的列表变量参与集合构造,则按直积的规则进行运算。直积又叫笛卡尔(Descartes)乘积 ,2个变量的直积是指:在集合A中任意取一个元素x,在集合B中任意取一个元素y,组成一个有序对(x,y),所有有序对的集合就是集合A和集合B的直积
Prelude> [[x,y]|x<-[1,2,3],y<-[4,5,6]]
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
Prelude> [[x,y,z]|x<-[1,2,3],y<-[4,5,6],z<-[7,8,9]]
[[1,4,7],[1,4,8],[1,4,9],[1,5,7],[1,5,8],[1,5,9],[1,6,7],[1,6,8],[1,6,9],[2,4,7],[2,4,8],[2,4,9],[2,5,
,[2,6,7],[2,6,8],[2,6,9],[3,4,7],[3,4,8],[3,4,9],[3,5,7],[3,5,8],[3,5,9],[3,6,7],[3,6,8],[3,6,9]]
Prelude>
我们可以加上约束条件
Prelude> [x*y*z|x<-[1,2,3],y<-[4,5,6],z<-[7,8,9],x+y+z <15]
[28,32,36,35,40,42,56,64,70,84]
Prelude> [[x,y]|x<-[1,2,3],y<-[4,5,6],x+y<5]
[]
Prelude> [[x,y]|x<-[1,2,3],y<-[4,5,6],x+y<6]
[[1,4]]
A.通过“_”实现无变量名读取元素
我们在mytest.hs中定义一个统计元素个数的函数:
mylength jh=sum[1|_<-jh]
我们只需要统计元素个数,无需要定义变量名,因为可以使用“_”来代替变量名。
加载mytest.hs后运行。
Prelude> :l f:/pro/mytest.hs
[1 of 1] Compiling Main ( F:\pro\mytest.hs, interpreted )
Ok, modules loaded: Main.
*Main> mylength [1..10]
10
*Main>
B.逐个提取元素
定义oddcount函数求所有的奇数的个数
oddcount jh=sum[1|x<-jh,x `mod` 2/=0]
求奇数个数
*Main> oddcount [1..11]
6
*Main> oddcount [1..10]
5
定义oddcount函数,求列表的偶数的个数
oddcount jh=sum[1|x<-jh,even x]
求偶数个数
*Main> evencount [1..8]
4
*Main> evencount [1..7]
3