python的函数式编程实例_函数式编程例子

函数式编程例子

【篇一:函数式编程例子】

08

年的时候

(

这经历记忆犹新

)

我也跟

lz

一样,翻了好多文章,

google

了好几个星期,最后我知道它

是这么个东西:

ul li

它是函数式编程的理论基础:

lambda

演算的一部分,而并非一个

实用

的东西,

也就是说,你在实际编程过程中碰不到它

——

你该用循环的时候就用循环,该用递归的时候就用递归,

y

组合子在哪里??你不需要知道,因为它并不是一个

用于编程的元素

,它只是

lambda

演算要实现逻

辑的完备而产生出来的一个

工具

br /li li

如果

lz

关注过

可计算性

或者

计算科学

方面的知识,就知道:

跟图灵机具有相同计算能力的另外一种更加简单的计算模型叫做

“lambda

演算

,也就是说,

lambda

算也是

图灵完备

的;且,也就是说,如果能够依据图灵机模型而构造出现代计算机的硬件体系结构的

话,同样也能根据

lambda

演算,创造一种计算机硬件;再,也就是说,图灵机模型能解决的问题,

lambda

演算也一定能解决,反之亦然

/li li lambda

演算是一个很优美的模型,它远比图灵机纸带模型简

单(它只有

alpha

变换和

beta

规约两种操作),但却有着和图灵机相同的能力;但光数学上证明这一

点还不甘心,于是呢,就真有人开始试着用

lambda

演算构建一个完整的形式逻辑系统,比如著名的

奇计数法

(church numeral

google

)”

,用来定义

0

1

2...

加减乘除

...true or false

布尔逻辑

...

等等

等等

...

这样继续下去之后,很快就遇到一个棘手的问题:

lambda

演算如何定义递归

(

或者说循环

) /li li

计算机的人一定从教科书上了解到:函数

递归

的意思就是一个函数

直接或间接地调用自身

”(

循环其实

也一样,循环可以归结为

尾递归

,下文就不说

循环

了,统一说

递归

”)

;通常的理解就是

——

在函数

内部

call

了自己的

名字

,但是原生的

lambda

演算里面的组合子都没有

名字

,那么如何调用到自己呢?

那么,问题也就归结成:

如何构建一个匿名递归函数

” /li li y

组合子的形式想必

lz

也看过了,我在这里

就不做定量的公式演算了,网上已经有太多的文章做了这样的演算,可以找来看;我只想说明一下这些

演算的意义:

y

组合子又叫

不动点组合子

不动点

的概念或许在高中就接触过,但高中时期的不动点,

就是一个数字而已,这里

不动点组合子

里面的

不动点

指的是

高阶函数

(

懂函数式编程应该知道这个概

)”

的不动点,它并不是一个单纯的数字,而是一个

函数

”(

其实单纯的数字也可以看作一个函数,只不

过是一个没有

x

自变量的函数,在坐标轴上是一条水平线

...

不过说这个的话就偏题了

:-))

;好了,既然

y

组合子是一个高阶函数,那么它也就是需要

接受一个函数,返回一个函数

了,那么

y

组合子刚好有这

样一种魔力:它接受一个函数,返回的是这个函数的不动点

... /li li

好了,那么如何使用这个

魔力

实现

递归呢?回想一下

函数的递归就是函数直接或间接地调用自身

;关键是

间接

二字,在没有名字的情

况下如何间接调用自身?那么

y

组合子给出的方案就是:把

自己

”“

算出来

/li li

那么总结就是:

y

组合

子是用作给那些没有名字的函数

把自己给算出来,方便自己调用自己

而创造的;它从实践上证明了

灵机模型能表达递归,

lambda

演算同样也能

的道理,属于

lambda

演算等价于图灵机

这一理论的

一个理论支撑;就是这样,它是理论层面的东西,你在平时编程中看不到它;它只奢求你在用

lisp

写出

一个递归函数的时候能想念起它就行了

... /li li

当然,现在我们用的

lisp

底层并非真的由

y

组合子实现:

它真正的实现是基于图灵机模型实现的

——

因为我们的计算机根本就不是根据

lambda

演算理论构建的,

但由于图灵机模型跟

lambda

计算是等价的,所以在我们冯氏计算机体系结构上实现

lisp

这种函数式语

言也是完全可行的。

(

假设人类当初是按照

lambda

演算的原理来制造计算机的,那么在其上实现

c

语言

也是完全理

【篇二:函数式编程例子】

这么简单,就像

jquery

以及

javascript

原生的数组函数的链式调用

这么简单。此外,我们常说

javascript

的一个重要特性就是闭包,

那么闭包肯定是

javascript

独有的吧?!其实不然,闭包只是函数

式编程的特性之一,由此看来函数式编程并不是想象的那么简单。

近日准备读一读

functional javascript

》一书,在此之前就先来浅

浅的探一探

高深

的函数式编程。当然并不要被如此

高深

的东西

吓到,其实很多特性和名词对于很多人来说都已经接触过了。除了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值