Haskell入门篇六:匿名函数定义
Posted Lambda小粽子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell入门篇六:匿名函数定义相关的知识,希望对你有一定的参考价值。
今天我给大家带来了一篇关于Haskell中lambda函数的知识介绍。Lambda函数在Haskell中扮演着非常重要的地位。而它的思想来源—Lambda演算,我们前文在介绍Haskell和函数式编程有所提到过,对整个计算机领域的发展都起到了极其重要的作用。
在一开始,我们先用一个例子来介绍一下如何用Lambda表达式来在Haskell中定义一个函数:
这个函数我在前面的文章有给大家定义过。函数add的作用是将两个整数相加。第二行是我们之前的定义,现在我们把它comment掉。第三行是我们用Lambda expression来定义这个函数。
下面我们来给出使用lambda expression来定义函数的格式:
其中第二行是我们之前就讲过的函数定义的格式,在不考虑函数『部分定义』和使用函数定义函数的情况下(即在定义函数的时候参数变量全部都提供完全),第三行的定义就是用Lambda expression的方式来定义一个函数。
从这个角度来看,其实一般的定义方法和我们现在所介绍的Lambda expression定义方法在思想上在我看来是有一点小小的差别的。之前讲到的定义,从直观上来看更像是偏重对函数体的定义,即在函数本身连同所需变量齐全的情况下去定义函数体的实现。而lambda函数更偏向于对函数的定义(从名字也能感受出来),即定义者更加注重于如何对『函数』的所有的element进行定义(包括变量的接受,当然也还有函数体的实现)。所以在函数体本身定义比较复杂时,当定义者更加关注于函数体实现时,我们可以采用传统的定义方法。而当我们更加注重函数本身的定义的时候,我们不妨一试使用Lambda expression去定义函数。Lambda 函数的思想也进一步与我之前提过的函数类型的右结合属性相呼应,这一点我会在之后有关讲解『函数部分实现』(partial application)的文章中重点提到。
lambda 函数有着另一个非常便利的作用。由于我们本身是在用lambda expression去定义一个函数(lambda expression本身就是一个完整的函数),所以很多时候我们可以不必提供函数名而去直接使用这个函数,这一点在高阶函数(higher order function)中尤为的便利(高阶函数会接收其他函数作为input argument),这就是我们所提到的匿名函数。在之前的文章中,大家也都或多或少接触到了这种定义,接下来我们就通过一个例子来更进一步的认识如何使用匿名函数:
今天给大家带来的函数是zipWith,相 信读过上篇文章的你们都能通过这个函数的类型大致猜出这个函数的作用。这个函数接收一个函数,和两个list作为变量,从而得出第三个list:
值得注意的有两点,首先,两个list的类型并不一定要一样,但一定要与第一个argument—那个函数的类型相匹配。这个函数的实现方法是依次从两个list中取出一个element并将第一个变量函数apply在这两个element上,从而得出一个类型与结果相同的element,最后将这些得出的element放入一个list中:
由于zipWith已经在GHC.List中被定义,我在这边给大家定义一个功能相同的函数便于大家理解。从定义中我们能发现第二个注意点,两个list的长度不一定要一致,但是相对较长的list的多出去的部分会被忽略掉。
在使用这个函数的时候,如果我们希望能使用它做一些special的事情,比如我希望最后结果的list里 面的数是第一个里面对应数的两倍加上第二个list里面对应数的十倍,那么我们就要自己去定义这个函数并将其传入zipWith函数中作为第一个变量了:
首先我们可以定义这么一个函数。
其次我们就可以将这个函数传入zipWith函数中来完成我们的想法。但其实如此『小的』一个函数我们并非一定要在脚本中定义它的主体,这个时候匿名函数的作用的发挥出来了,我们可以这么写:
如大家看到的,这两个方法的结果完全一致,相较于第一种单独定义函数,第二中的方法显然更为的方便(我们再也不用绞尽脑汁去给这种不重要的函数去想名字了哈哈哈),这也是我最开始就提到的,lambda函数在Haskell中扮演着十分重要作用的原因,之一。
下一篇文章是拓展篇,我会通过介绍Lambda演算来给大家仔细的讲解定义lambda函数时所需要注意的地方,还有lambda函数在实现时的具体步骤,敬请期待吧~
注:本文为原创内容,转载请标明出处。
以上是关于Haskell入门篇六:匿名函数定义的主要内容,如果未能解决你的问题,请参考以下文章
Python入门之经典函数实例——第2关:Lambda函数 - 匿名函数的使用