为可爱的lambda散分

sjjf 2007-09-01 05:48:46
昨夜,码了2000多字的论文,实在江郎才尽了,
跑去看看lambda,
看了半夜还是没有完全看明白,
以前对看计算理论导引的时候知道图灵邱奇论题,
却没有关注过邱奇的lambda算子,以为没有啥子东西在里面(书中也没有相关的知识)。
现在再去看看时候却发现是块珍宝............
确实是个很强大的工具。
也明白了mit那些家伙为什么喜欢lisp了。
也明白为什么lisp会被入选为黑客必须掌握的语言了。
有种想哭的感觉,又发现自己白活了几年了。

...全文
637 56 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjjf 2008-05-08
  • 打赏
  • 举报
回复
先结贴,以后学习有新的再开
ar_2002 2007-12-28
  • 打赏
  • 举报
回复
不知道接过分没有
xingxingxiangrong 2007-12-28
  • 打赏
  • 举报
回复
up
sjjf 2007-12-28
  • 打赏
  • 举报
回复
关于curry化的概念的错误的澄清:
wiki上是这么描述的:

在计算机科学中,Curry化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schönfinkel 和 Gottlob Frege 发明的。

在直觉上,Curry化声称“如果你固定某些参数,你将得到接受余下参数的一个函数”。所以对于有两个变量的函数y的x次方,如果固定了 y = 2,则得到有一个变量的函数 2的x次方。

在理论计算机科学中,Curry化提供了在简单的理论模型中比如只接受一个单一参数的lambda 演算中研究带有多个参数的函数的方式。

==============================================
so.

sjjf 23:41:47
比如 入.x 入.y x 完全可以用 表达成 f(x,y)的方式

应该表达成:
多参数的lambda表达式
入.x y M 和 单参数的 入.x 入.y M 等价
想不同curry的时候可以借助多重积分公式来理解。
goodbee 2007-12-21
  • 打赏
  • 举报
回复
受教育啊
iambic 2007-12-21
  • 打赏
  • 举报
回复
按我所受的教育,closure是"close over"的意思。
飞哥 2007-12-21
  • 打赏
  • 举报
回复
偶也看看lambda
ztj111 2007-12-21
  • 打赏
  • 举报
回复
up
xuelong_zl 2007-12-21
  • 打赏
  • 举报
回复
神j呀
liln0530 2007-12-21
  • 打赏
  • 举报
回复
up
herman~~ 2007-12-20
  • 打赏
  • 举报
回复
up
受教了
Wolf0403 2007-12-20
  • 打赏
  • 举报
回复
sjjf 22:17:41
在数学里面,closure是指具有闭包性质的集合。而所谓闭包性质是指一个集合在一个运算下,得到的变换结果仍然是这个集合。但是在lisp社区,他们表达了这样一个概念:closure是一种表示带有自由变量的过程而采用的技术。
sjjf 22:12:53
就在这里忽悠一圈,有什么问题指正一下阿
sjjf 22:13:26
这次忽悠的主题是 js的closure为什么叫 closure
sjjf 22:14:36
首先,先来一个关于js的closure的简单的直观地感受吧,看一下代码
sjjf 22:15:24
<SCRIPT LANGUAGE="JavaScript">
<!--
var aa = function(e){
return function(){
alert(e);
};
};
aa("abc")();
//-->
</SCRIPT>
sjjf 22:15:57
这个玩意儿就叫作closure.
sjjf 22:16:11
好了,现在来看看数学上的closure的定义:
病态的完美主义22:16:15
是说 function(e) 的部分,还是 return function() {..} 的部分
sjjf 22:16:30
狒狒,先别急
病态的完美主义22:16:33
OK
sjjf 22:16:42
慢慢看,答案就在下面
sjjf 22:17:13
数学定义:closure是 一个集合在某个运算下得到的变换的结果如果还在这个集合内,这个集合相对于这个运算(操作)就具备closure性质
sjjf 22:17:41
在数学里面,closure是指具有闭包性质的集合。而所谓闭包性质是指一个集合在一个运算下,得到的变换结果仍然是这个集合。但是在lisp社区,他们表达了这样一个概念:closure是一种表示带有自由变量的过程而采用的技术。

sjjf 22:18:40
x属于 集合A
x--〉运算p--〉y
y属于集合A
对于集合a的任意元素,都满足,那么称 集合a在运算p下具有闭包性质

sjjf 22:20:51
这是数学上的定义,可能你们的第一影响和js的那段代码肯定对不上号,不明白为什么js的那段代码叫做js的函数的closure性质
sjjf 22:21:03
我最初也是存在这个迷惑的

sjjf 22:21:42
现在先将这个问题搁浅,看看lisp社区的关于closure的定义
sjjf 22:21:55
是一种表示带有自由变量的过程而采用的技术。
sjjf 22:22:47
所谓的自由变量,给你们一篇文章的连接看完后再来听
sjjf 22:25:01
http://www.wikilib.com/wiki?title=%E8%87%AA%E7%94%B1%E5%8F%98%E9%87%8F&variant=zh-sg

sjjf 22:28:49
<SCRIPT LANGUAGE="JavaScript">
<!--
var aa = function(e){
return function(){
alert(e);
};
};
aa("abc")();
//-->
</SCRIPT>
这个形式,可以和lambda的 入.x 入.y x 形式等价
sjjf 22:28:56
ps:入读lambda(λ)
sjjf 22:32:11
好了,借助 c的方式,我们换一个角度来看那段代码
sjjf 22:33:35
先对函数这个东西来进行变换角度

比如有一段代码
int fun(int x)
{return 2*5}
那么 fun是一个指针,指向一段空间,
我们调用 函数 f(5)只不过是在这个指针上施加一个操作叫函数调用的操作(这个操作是我给它虚拟的)
函数调用的操作和其他的操作比如对 fun指针加偏移量之类的操作是同等意义的,这种意义就像 + - * / 对一个数的意义一样。

sjjf 22:33:48
这个变换能承受不?
木有美女(25926906) 22:34:23
那不就是个callback嘛
木有美女(25926906) 22:34:40
调用时不要参数的callback就叫closure嘛
sjjf 22:35:22
不,我只是叫你换一下角度去看一个函数 把 函数体和调用这个操作分离开来
sjjf 22:35:58
当一个函数A返回一个函数B的时候,那么
可以分解成这样的一种方式
A属于 函数对象集合 对A施加操作“函数调用” 得到结果 函数对象B
而函数对象B 也属于 函数对象集合

sjjf 22:37:00
回头再去看看数学的定义,两者是不是统一到一起去了?
病态的完美主义22:37:56
感觉像是扯淡。。任何 T op (T t) 都是 closure?
sjjf 22:39:53
T op (T t) 是啥意思啊?
sjjf 22:40:18
本来closure这玩意儿就是普遍的阿
病态的完美主义22:40:19
任何以 T 类型为输入,且以 T 类型为输出的操作都是 closure
sjjf 22:40:26
是啊
sjjf 22:42:29
例如 链表 (节点,下一个节点的指针)这样的形式
c语言方式,
struct Pair
{ int a;
struct Pair * next } x,y,z;
那么可以有这种形式的调用

相对于 -〉next这个操作
Pair 集合 具有闭包性质


sjjf 22:45:14
会回头来看看 lambda的 入.x 入.y x 这种玩意儿把
sjjf 22:46:58
在这个等式里面, 入.x 入.y x 对于 入.y x 来说,x是自由变量,对于 入.x 入.y x 来说,x就是约束变量了

sjjf 22:49:38
可有了解 lambda的beta规约的几个策略的?
sjjf 22:50:45
如全beta规约,规范顺序规约,按名调用规约,按值调用规约 这几种策略的
sjjf 22:51:14
好吧,顺便吹一下lambda的水

sjjf 22:53:11
1.lambda的语法:
a.任何一个变元都是项
b.如果M,N都是项,那么 (MN)也是项--函数应用
这意味着 将N应用到 M,也就是把N当作参数,传给M
c.如果M是项,x是变元,那么 λx.M也是项--函数抽象
也就是函数定义。 可以认为函数体是M ,参数是x
d.仅仅由这些规则归纳定义的符号串也是项

sjjf 22:54:57
这是lambda的语法
呆熊(116455762) 22:55:30
浪费了,《什么是数学》那本书不在……

sjjf 22:58:44
2.alpha变换: 入x.M=入y.M[x/y]
sjjf 23:00:52
这段话的意思是,x在入x.M这个项中是一个约束变量,
用y来代替x这个量后,得到另外一个等价的式子
入y.M[x/y]

α变换:http://blog.sina.com.cn/s/blog_4aa1dcb9010009uz.html

sjjf 23:04:06
x/y意思就是用y来代替x

sjjf 23:04:50
alpha变换的意思就是只作简单的符号变换,
用来区分约束变量和自由变量
sjjf 23:05:27
实际上,如果你足够强悍,能够一样就能看得清楚
各个变量的辖域
sjjf 23:05:44
那么可以不用做alpha变换

sjjf 23:07:20
这是alpha变换,
接着到beta规约了
(见上述blog)
sjjf 23:15:19
(λx.M)N 规约为 M[x/N]
sjjf 23:16:10
意思就是表达 (M N)的意思,
就是将 N替换掉 M的参数,得到的结果
sjjf 23:16:59
规约很简单,但是规约确实最重要的
sjjf 23:17:06
规约有好几种策略
sjjf 23:17:44
对于一个复杂的表达式,进行规约后才能得到比较简单的
表达式
sjjf 23:18:04
第一种规约策略叫做:全beta规约
sjjf 23:19:36
回到全beta规约吧,全beta规约的意思是
可以在任意的地方的某个约式进行规约,也就是没有章法了
sjjf 23:20:16
第二种策略: 规范顺序规约
最左边,最外边的约式总是第一个规约
sjjf 23:21:25
第三种策略:按名调用策略
不允许在抽象内部规约

sjjf 23:23:20
第四种策略:按值调用规约
只有最外层的约式可以规约,并且只有当该约式的右边已经规约到一个值时才能进行规约
sjjf 23:24:18
入x.m
sjjf 23:24:26
就叫做函数抽象
sjjf 23:26:02
c语言貌似是按值调用规约策略
sjjf 23:26:53
所以c语言实现不了刚才的那种js的closure (这点我没有确定)

sjjf 23:31:28
好了,现在再来看看
<SCRIPT LANGUAGE="JavaScript">
<!--
var aa = function(e){
return function(p){
alert(e+"-"+p);
};
};
aa("abc")("ef");
//-->
</SCRIPT>
以及
抽象的形式
入.x 入.y x
sjjf 23:32:18
js用的应该是按名调用规约
sjjf 23:34:36
入.x 入.y x 的意思是
我们传入第一个参数 “abc”进去后规约得到了一个项 入.y M
再传入 ef 后,项 入.y M 被规约,从而求出 最后的结果

sjjf 23:37:39
我只是看到
<http://blog.csdn.net/g9yuayon/archive/2007/04/18/1568980.aspx>
sjjf 23:37:56
这篇文章里面提到了,所以我才开始思考的

sjjf 23:38:18
找到了最初的closure的来源
sjjf 23:38:24
是lisp

sjjf 23:40:09
对了,关于多个参数
sjjf 23:40:21
纯lambda是只有一个参数的
sjjf 23:40:55
但是,多个参数是可以通过curry变换达到
sjjf 23:41:47
比如 入.x 入.y x 完全可以用 表达成 f(x,y)的方式

lisp 函数的 lambda 对应:
(defun build()
(compile "make -k all tags"))
对应
入.x M N
N== make -k...
M = compile
luojingpo 2007-12-20
  • 打赏
  • 举报
回复
我要哈哈!
ar_2002 2007-12-20
  • 打赏
  • 举报
回复
up
yjukh 2007-11-09
  • 打赏
  • 举报
回复
lambda 是啥
ouyh12345 2007-11-08
  • 打赏
  • 举报
回复
mark
clhposs 2007-11-08
  • 打赏
  • 举报
回复
帮顶
呵呵
sms88 2007-11-06
  • 打赏
  • 举报
回复
以前看书的时候,书中提到过lambda,可当时觉得这东西离自己很远,
没想到在boost里有,并很多人用
hibin168 2007-11-06
  • 打赏
  • 举报
回复
虽然我不是很懂,便我相信楼主一定很强吧,加油站!!!
thecorr 2007-11-06
  • 打赏
  • 举报
回复
顶一下
加载更多回复(35)

15,447

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧