我们在写一个函数时,有一个很通用的步骤,即从传入的参数中进行一些预处理,比如从对象中取出某个属性,然后声明一些局部变量。
例如将一个Point类的xy属性相加,我们一般会这样写(不用考虑此函数本身的意义了…)
public double add(Point p)
{
int x=p.x;
int y=p.y;
return x+y;
}
虽然直接return p.x+p.y也可以,但总归是要有一个从对象中取数据的过程。
haskell的模式匹配,基本上就是将这个取数据的过程大大简化,直接将他们声明成参数了
--等价的haskell
pointAdd (Point x y) = x+y
然后还可以匹配直接量
下面这个在命令式语言里基本上就是一个switch
sayMe :: (Integral a) => a -> String
sayMe 1 = "One!"
sayMe 2 = "Two!"
sayMe 3 = "Three!"
sayMe 4 = "Four!"
sayMe 5 = "Five!"
sayMe x = "Not between 1 and 5"
有人可能觉得这样写莫名其妙,其实这主要因为haskell是一个函数式的语言,将switch的几条判断,拆成多个函数,总之就是函数分的越细越好,越细越灵活,你就把haskell里的函数当成至高无上的一个存在就行了,整个语言都是围着函数转,所以能用多条函数写的时候,尽量不要用其他结构写(否则你还来学haskell干嘛啊)
haskell里的 _ 占位符基本上和python,lua,go里的差不多,唯一注意的就是他是匹配任意参数的,所以如果有个带 的函数写在最前面(如果一个全带 的函数写在最顶端,那他基本上就是错的),就需要注意他会不会覆盖后面的匹配。
欢迎关注我的github
https://github.com/luckyCatMiao