这里转一篇09年月影的关于泛函及函数变换的文章,很好的学习资料,着实学习了一下Javascript语言的灵巧强大之处。

 

浅说泛函与函数变换

Code:



但是问题来了,如果另一个应用里,过程a之后接着要执行一个过程c,那么:

Code:



有没有办法把这个过程合二为一呢?答案是有的:

Code:



在这里comb就是一个最基本的“泛函”,它返回将两个函数先后执行的函数,或者也可以看成它对两个函数作了一个“加法变换”: comb: f=f1+f2

设计实用的函数变换

函数变换是一种特殊的泛函,它是以某个函数为中心的泛函过程。
通常来说,我们认为函数变换产生新的函数,但是,如果你把JavaScript函数看作一个具有输入和输出的元件的话,那么函数变换产生的结果可以看成是改变函数的输入或输出
在这里,我们为了简单化设计,把函数变换分成改变输入和改变输出两类,并把这两类变换称为基本变换,前面说过函数变换是可以迭代的,所以同时改变输入和输出的函数变换可以通过基本变换组合产生。

接下来,我们主要考虑函数基本变换形式。我通过事件模型来建立基本变换(其实用事件模型不是必须的,只是这么做理解起来稍微简单些):

Code:



OK,现在我们有了第一个泛函,我在这个泛函里给函数本身增加了两个事件,在这两个事件里通过操作事件参数可以改变函数的输入参数和返回值。

现在我要先做一件事情,就是把这个泛函(它本身也是函数)给变换到Function的prototype上去:

Code:



所以methodize是我们的第二个泛函。有了它,可以做如下的事情:

Code:



OK,现在泛函更加易于使用了,目前我们用到了on-before,还没有用到on-after,但是我觉得传before、after的参数显得太麻烦,因此我再写第三个泛函:

Code:



curry这个泛函进行了将默认参数先赋予指定函数的一个变换。到目前为止我们的变换仅限于改变参数(通过on-before),那么改变返回值有什么用呢?

简单举一个例子,事实上,我们可以尝试着为一般函数建立一个归约(reduce)规则:

Code:



泛函reduce将函数按参数进行归约,例如:

Code:



事实上,除了reduce之外,我们还可以将函数变换作用于需要链式调用的场合,所谓链式调用即形如o.a().b().c().d()...的形式,一般来说要实现链式调用有两种情况,一种是函数自身的返回值进行包装后支持链式调用,一种是改变函数的返回值将函数的第一个参数包装后返回,无论怎样的情况,链式调用都能用基本函数变换来实现,这里就不列举了。

前面我们简单用on-before、on-after实现了多个基本函数变换,事实上,函数变换还有更复杂的形式,现在我们写一个稍稍复杂的函数变换——multi

Code:



这个变换将第一个参数的list给函数依次执行,执行结果也作为列表返回。这个变换本身其实不是一个基本变换,它既改变了参数(虽然仅仅是类型发生变化),又改变了返回值,而且实际上这个变换执行的是函数的重复迭代。

Code:



函数变换的组合使用

实际上,在前面的介绍中我们了解了基本的函数变换,并且在例子中,其实我们在对这些变换进行组合应用,不过在组合应用时必须注意变换本身对参数造成的影响,这些影响会关系到组合变换的次序。例如你先对一个函数进行multi变换再进行methodize变换和先对一个函数进行methodize变换再进行multi变换,将得到截然不同的结果,原因是methodize变换事实上减少了输入参数的个数。

批量变换

我们建立一个map方法,就能很方便地将一组函数批量变换到要使用它的对象(或原型)上。

Code:



现在我们建立执行批量操作的对象,或者方法集合,比如我们可以把刚才分散的Function.prototype属性赋值集中起来:

Code:



新的模式

事实上到这里我们可以建立一个新的模式,提供批量操作方法,将一组简单的函数经过复杂变换复制到我们需要这些操作的对象或集合上去。这种模式可以允许你先建立轻量的,无污染的模型,然后以某些变换组合将这些模型整理成对象或者创建类,具体细节完全可以交给你实现的函数变换器去处理。

 

转自:http://bbs.51js.com/viewthread.php?tid=85538

相关文章:

  • 2022-12-23
  • 2021-11-17
  • 2021-05-12
  • 2021-09-02
猜你喜欢
  • 2021-05-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-15
  • 2022-12-23
相关资源
相似解决方案