函数式编程例子
【篇一:函数式编程例子】
在
08
年的时候
(
这经历记忆犹新
)
我也跟
lz
一样,翻了好多文章,
了好几个星期,最后我知道它
是这么个东西:
ul li
它是函数式编程的理论基础:
lambda
演算的一部分,而并非一个
“
实用
”
的东西,
也就是说,你在实际编程过程中碰不到它
——
你该用循环的时候就用循环,该用递归的时候就用递归,
y
组合子在哪里??你不需要知道,因为它并不是一个
用于编程的元素
,它只是
lambda
演算要实现逻
辑的完备而产生出来的一个
工具
br /li li
如果
lz
关注过
“
可计算性
”
或者
“
计算科学
”
方面的知识,就知道:
跟图灵机具有相同计算能力的另外一种更加简单的计算模型叫做
“lambda
演算
”
,也就是说,
lambda
演
算也是
“
图灵完备
”
的;且,也就是说,如果能够依据图灵机模型而构造出现代计算机的硬件体系结构的
话,同样也能根据
lambda
演算,创造一种计算机硬件;再,也就是说,图灵机模型能解决的问题,
lambda
演算也一定能解决,反之亦然
/li li lambda
演算是一个很优美的模型,它远比图灵机纸带模型简
单(它只有
alpha
变换和
beta
规约两种操作),但却有着和图灵机相同的能力;但光数学上证明这一
点还不甘心,于是呢,就真有人开始试着用
lambda
演算构建一个完整的形式逻辑系统,比如著名的
“
邱
奇计数法
(church numeral
请
之
)”
,用来定义
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
》一书,在此之前就先来浅
浅的探一探
“
高深
”
的函数式编程。当然并不要被如此
“
高深
”
的东西
吓到,其实很多特性和名词对于很多人来说都已经接触过了。除了