Haskell入门篇八:高阶函数(上)

Posted Lambda小粽子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell入门篇八:高阶函数(上)相关的知识,希望对你有一定的参考价值。

今天的文章带给大家的是关于高阶函数的介绍和应用。在这里,我们称所有以其他函数为参数的函数为高阶函数。

之前的文章有提到过,在Haskell中,函数的类型是右结合的,即 a -> b -> c 等价于 a -> (b -> c)。这样的函数我们称之为柯里化函数(curry function)。

柯里化函数与我们平常在编程中接触的函数有所不同。柯里化函数一次只接受一个参数,并返回余下的包括接收参数和返回结果的新函数。柯里化函数与我们提到的函数类型右结合完美的相互呼应。同时也引出了两个新的概念:柯里化(curring),函数部分实现(partial application)。 

柯里化的过程,是将一个同时接收多个参数的非柯里化函数转化为柯里化函数的过程。同理也有将柯里化函数转化为非柯里化函数的过程。

我们在Haskell中尝试定义这两个过程(Prelude中已经定义好了curryuncurry函数),结合我们之前学到的Lambda  expression,我们将如下定义这两个函数。


接下来是这两个函数的实现部分。首先我们定一个一个函数add,类型为Num a => (a, a) -> a(由于方便起见我们直接用Lambda expressionPrelude中进行定义),然后我们分别应用curryuncurry的过程。注意当我们调用add函数和最后uncurry后的函数时,我们需要提供一个参数对(tuple),即一次性提供所有的参数,这和我们之前在大多命令式语言中接触的函数定义是相同的,而在curry化的函数中我们将参数一次提供给函数。

Haskell入门篇八:高阶函数(上)


柯里化在高阶函数中也是非常重要的。在高阶函数的数学定义中,返回一个函数作为结果的函数同样也是高阶函数。但是在Haskell中返回函数作为结果通常是柯里化的原因(即函数部分应用),所以在我们在Haskell中讨论高阶函数的时候我们主要关注于接收函数为参数的函数。

函数部分应用在我们之前的文章已经提到过了,在这里我们再从另一个角度来看一看。通过上面的介绍我们知道了在Haskell中函数的部分应用是柯里化的特点和结果。而部分应用后的函数,作为一个拥有新类型的函数,可以作为参数作为另一个函数的输入变量,这一点在Haskell中是非常常见的,而通过函数的精炼的组合而最终得到我们想要的编程结果正是Haskell作为函数式编程的魅力所在之一。  

今天带给大家的例子是filter函数。这个函数接收一个函数和一个list,筛选list中所有『满足条件』的元素。接下来我们来尝试自己定义一下这个函数。 

Haskell入门篇八:高阶函数(上)


这个函数的定义并不复杂,但是函数本身却非常的实用。而函数本身的思想也和我们之前提到过的maptakeWhile十分的相似。

Haskell入门篇八:高阶函数(上)


如图所示,这个函数的作用是将list中所有满足条件的元素筛选出来。在我们之后的的应用中,我们会经常对list进行操作,而这个函数就是这一系列函数的核心之一。


今天的文章先介绍到这里。这一块的内容比较多,我打算将其分成两个part,在下一篇的文章中我会介绍折叠函数和复合函数,敬请期待。



注:本文为原创内容,转载请标明出处。





以上是关于Haskell入门篇八:高阶函数(上)的主要内容,如果未能解决你的问题,请参考以下文章

Haskell入门篇九:高阶函数(下)

python入门16 递归函数 高阶函数

Python 高阶函数与函数式编程入门

07.Javascript——入门高阶函数

Golang入门到项目实战 | golang高阶函数

Android:Kotlin详细入门学习指南-高阶函数-基础语法