Haskell入门(五)高阶函数(higher-order functions)

参考教材:Learn You a Haskell for Great Good (http://learnyouahaskell.com/)

操作环境:Ubuntu下Linux64位虚拟机

python入门编程, 之后用c++学习数据结构,Haskell萌新。

由于对Haskell中一些词语的中文翻译并不了解,接下来的内容中重点名词将有英文和我理解的中文。


Chapter5主要内容

调制函数(curried function)

在前面学习的函数里,我们理解的函数通常接受一个或多个参数(parameter),并返回对应的结果,而这个结果也通常以参数的形式表示。这里我们讨论调制函数。调制函数总是仅仅接受一个参数,不同的是它返回值可以是函数,返回的函数可以再接受下一个参数,以此类推。

例子:max

我们在前面的学习过程里用到的max获取两个可以比较优先级的同类参量,返回其中的较大值。从调制函数的角度思考这个函数,我们会有另外的发现。

max函数

通过:t max 我们可以看到max函数的声明。由于->符号是右结合的,我们又可以把它写成a -> (a-> a)的形式。也就是说,max函数获取一个参数,返回声明为a->a类型的函数。如果我们输入max 4,我们获取到的正是这个函数。然而,由于Haskell并不了解a->a类型的函数要怎么输出,这一输入在命令行状态下会报错。

不完全函数(partially applied function)

不完全函数是指,我们仅为某个函数提供了它所需要的部分参数,因而从调制函数的角度,它会返回一个需要若干个我们未提供的参数的函数。可以理解成一系列化学变化,我们只提供了足够其中一部分步骤需要的原料(中间产物),因而并不能直接得到最终需要的结果。

例子:multThree函数


不完全函数

按照前几章学习的内容,上面的multThree函数本身需要三个参数。当我们仅仅提供一个参数时,由调制函数的观念,我们会得到一个需要两个参数的不完全函数。这个不完全函数可以用于后续应用。

例子:使用分块(section)实现不完全中序函数

中序函数通常输出针对二元函数而言的。为了实现一个不完全中序函数,我们仅仅需要对它的实现的整个步骤加上括号,略去缺省的部分。

不完全中序函数的实现

常见功能的实现


函数间的调用

下面是map函数与filter函数的使用。注意到,由于内部也有叫map和filter的函数,导入baby.hs文件会由于有歧义而报错。一种解决方案是改变新定义的名称,例如加上'。不知道haskell里面有没有类似于c++ ::限制域的标识符。

map与filter函数


函数的复合应用

你可能感兴趣的:(Haskell入门(五)高阶函数(higher-order functions))