24、Data.Set
Set介于列表和映射之间,所有的元素唯一。
fromList构造Set。
Prelude Data.Set> let x=Data.Set.fromList [11,22,33,44,55]
Prelude Data.Set> let y=Data.Set.fromList [91,32,33,44,55]
Prelude Data.Set>
Intersection完成set的交
Prelude Data.Set> intersection x y
fromList [33,44,55]
Prelude Data.Set>
difference去除第一个set中的某些元素,这些元素是与第二个set的交。
Prelude Data.Set> Data.Set.difference x y
fromList [11,22]
Prelude Data.Set>
union完成2个set的并
Prelude Data.Set> Data.Set.union x y
fromList [11,22,32,33,44,55,91]
Prelude Data.Set>
null、size、member、empty、singleton、insert和delete与map相对应的操作类似。
25、定义模块
我们把以前的练习定义的部分函数创建一个自己的模块:
我们定义2个模块:Mymodule.Test2和Mymodule.Test1
首先建立2个程序文件:test1.hs和test2.hs
Test1.hs内容为 :
module Mymodule.Test1
(mylength
,oddcount
,evencount
,mysum
)where
--------------
mylength jh=sum[1|_<-jh]
oddcount jh=sum[1|x<-jh,x `mod` 2/=0]
evencount jh=sum[1|x<-jh,even x]
-------------
mysum :: (Integral a)=>a->a
mysum 0=0
mysum n=n + mysum (n-1)
Test2.hs内容为 :
module Mymodule.Test2
(myfst
,mycnt
,mylst
,mymin
)where
------------------
myfst ::(a,b,c)->a
mycnt ::(a,b,c)->b
mylst ::(a,b,c)->c
myfst (a,_,_)=a
mycnt (_,b,_)=b
mylst (_,_,c)=c
----------------------
mymin::(Ord a)=>[a]->a
mymin []=error "empty list!"
mymin [x]=x
mymin (x:xs)
|x<minval=x
|otherwise=minval
where minval=mymin xs
将这2个文件放在需要使用这2个模块的程序执行目录的子目录Mymodule下。然后编写一个程序加载这2个模块,并调用里面的函数
import Mymodule.Test1
import Mymodule.Test2
test1_1 a=mylength a
test1_2 a=evencount a
test2_1 a=mycnt a
test2_2 a=mymin a
运行测试一下:
*Main> :load "mytestm.hs"
[1 of 3] Compiling Mymodule.Test2 ( Mymodule\Test2.hs, interpreted )
[2 of 3] Compiling Mymodule.Test1 ( Mymodule\Test1.hs, interpreted )
[3 of 3] Compiling Main ( mytestm.hs, interpreted )
Ok, modules loaded: Mymodule.Test1, Mymodule.Test2, Main.
*Main> test1_1 [11,22,33]
3
*Main> test1_2 [11,22,33]
1
*Main> test2_2 [11,22,33]
11
*Main> test2_1 (11,22,33)
22
*Main>