haskell(7)

本博客所有内容是原创,未经书面许可,严禁任何形式的转载。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值