了解高阶函数
高阶函数是Haskell的重要性质,同时也是所有函数式语言的共同性质,高阶函数实际上就是函数的函数,就是把某个函数作为另一个函数的参数的形式,就是高阶函数。
还是来看个例子吧, 取一个函数并调用它两次的函数 ,用数学表达式表达出来就是 f(f(x)),而在Haskell中写函数其实和数学上的表达式非常接近,这也是为什么说Haskell更加接近数学的原因。
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
(a->a)
表示第一个参数是一个函数,这个函数输入是a
类型,输出也是a
类型,第二个参数a
表示第二个参数是个变量,然后这个函数输出也是个变量。
再看第二行,f
表示函数,这个appleTwice
函数实际上就实现了 f(f(x))
的功能,并且,在实际中,f
是一个抽象概念,可以表示任意参数为变量的函数,这和数学上的f(x)非常相似,f(x)就是表示自变量为x的任意函数,所以我们在调用的时候可以这样。
applyTwice (+3) 10
表示,(10+3)+3,其中f(x)=x+3,所以f(f(x))=x+3+3。
当然,我们也可以来一个复杂一点的,这里就使用了匿名函数了。
applyTwice (\x->x^2+3) 10
这里,括号里面的就是匿名函数,这个概念应该大家都不陌生了吧,实际上整个函数就是 f(f(x))=(x^2+3)^2+3。
Map和 Filter
Map和Filter也是函数式编程中的重要组成部分,并且这个概念已经被很多命令行的编程语言所接纳了,比如Python中就有这两个概念。
Map就是从一组List中挨个取出元素,并把元素都执行指定的函数,然后生成一组新的List。
比如我们有一组List,[1,2,3,4,5,6],我需要将他们都平方以下,按照之前的做法,我们可以这么写:
[x^2 | x<-[1,2,3,4,5,6]]
如果我们用Map的形式,可以这么写:
map (\x->x^2) [1,2,3,4,5,6]
这就是Map,和上面的写法完全等价,但是显得更加明朗一些。
Fliter是输入参数是一个限制条件和一个 List,回传该 List 中所有符合该条件的元素。
比如我们要再一组List中找到大于3的所有数,按照之前的写法,我们可以这么来:
[x | x <-[1,2,3,4,5,6],x>3]
同样,如果用filter,可以这么写
filter (>3) [1,2,3,4,5,6]
Map和Filter是函数式编程的重要思想和方法,已经被借鉴到很多语言中,所以得认真掌握哦。。
函数组合
函数组合,实际上是一个简写函数的方式,比如一个List xs,我们需要依次调用a,b,c三个函数,那么我么可以这么写 c.b.a xs
,实际上表示 c(b(a xs))
。
匿名函数
匿名函数我们就不具体说了,上面我们已经开始使用了,他的一般形式是:
\参数 -> 函数体
,如\x -> x^2+3
- 匿名函数没有函数名