下面是一个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>