下面是一个2维向量长度比较的例子
vlencompare::(RealFloat a)=>(a,a)->(a,a)->Ordering (x1,y1) `vlencompare` (x2,y2) |(sqrt (x1^2+y1^2)) == (sqrt (x2^2+y2^2)) =EQ |(sqrt (x1^2+y1^2)) > (sqrt (x2^2+y2^2)) =GT |(sqrt (x1^2+y1^2)) < (sqrt (x2^2+y2^2)) =LT
加载后运行
*Main> (12,18) `vlencompare` (-12,18)
EQ
*Main> (12,18) `vlencompare` (-12,-18)
EQ
*Main> (12,18) `vlencompare` (-12,16)
GT
*Main> (12,18) `vlencompare` (-12,1)
GT
*Main> (12,18) `vlencompare` (-10,1)
GT
*Main> (12,18) `vlencompare` (-10,16)
GT
*Main> (12,18) `vlencompare` (-18,26)
LT
13、Where
Where构造的变量可以在全部函数中访问,包括所有的guards,我们也可以通过where对参数变量的计算进行简化。
vlencompare::(RealFloat a)=>(a,a)->(a,a)->Ordering (x1,y1) `vlencompare` (x2,y2) | vec1== vec2 =EQ | vec1 > vec2 =GT | vec1 < vec2 =LT where vec1 =(sqrt (x1^2+y1^2)) vec2 =(sqrt (x2^2+y2^2))
14、Let
“let....in...”语句完成构造一个局部变量,其应用范围在in以内。
如,定义一个求向量长度的函数
vector3_len::(RealFloat a)=>(a,a,a)->a vector3_len vec= let (x,y,z)=vec in sqrt (x^2+y^2+z^2)
加载并运行:
*Main> vector3_len (12.44,19.12,22)
31.691134406959936
15、Case
编写一个将数字0和1转换为相应逻辑值的程序
“case...of...”可对同一表达式进行多个模式的匹配。
int2bool::Int->Bool int2bool mynum = case mynum of 0->False 1->True
加载后运行
*Main> int2bool 1
True
*Main> int2bool 0
False
*Main>