Y组合子】的更多相关文章

Y组合子:\f.(\x.f(xx))(\x.f(xx)),接受一个函数,返回一个高阶函数 Y组合子用于生成匿名递归函数. 什么叫匿名递归函数,考虑以下C语言递归函数 int sum(int n) { return n == 0 ? 0 : n + sum(n-1); } 这个函数在内部递归调用了自身,调用自身需要函数本体的名字,这个函数叫sum,sum内部用名字sum,递归调用了自己 在lambda演算中,可以写成类似的表达式sum = \x. x == 0 ? 0 : sum x 但是对于一个…
问:上回乱扯淡了一通,这回该讲正题了吧. 答:OK. 先来列举一些我参考过,并从中受到启发的文章. (1.)老赵的一篇文章:使用Lambda表达式编写递归函数 (2.)装配脑袋的两篇文章:VS2008亮点:用Lambda表达式进行函数式编程和用Lambda表达式进行函数式编程(续):用C#实现Y组合子 (3.)Y组合子的推导过程(用Scheme推导),这里的"推导"并不是数学意义上上的推导证明,而是说如何一步步引导构想出Y来的,值得一看.也许从某种程度反应出了当年Y是如何被发明的. […
答:关于Fix的问题你fix了吗? 问:慢着,让我想想,上次留下个什么问题来着?是说我们有了一个求不动点的函数Fix,但Fix却是显式递归的,是吧? 答:有劳你还记的这个问题. 问:Fix的参与背离了匿名递归的定义,所以-所以-我们被Fix给坑了? 答:当然不是.你还记的第(一)章我们讨论过什么吗? 问:记的,我们把一个显式递归的Fact变成了一个匿名递归的结构. 答:很好,让我们再造一次轮子. 问:哦!我明白了,是用与上次类似的方法,把Fix写成一个匿名递归的Lambda. 答:就是这个意思,…
问:上一回,你在最后曾提到"抽象性不足",这话怎么说? 答:试想,如果现在需要实现一个其它的递归(比如:Fibonacci),就必须把之前的模式从头套一遍,然后通过fib_maker(fib_maker)来返回一个fib函数.可见,这个产生递归过程的"接口"让用户相当不舒服. 问:嗯,fib_maker(fib_maker)这种形式看起来的确不怎么舒服,那又如何对其进行抽象,以得到更好的接口呢? 答:这里,有两条路可以走.其一,就是对fact_maker(fact_…
问:啊!我想要一个匿名的递归… 答:Y(音同Why)… … … 问:作为一位命令式语言的使用者,为什么会突然折腾起Y组合子呢? 答:的确,这事儿要从很久以前的几次搁浅开始说起…上学的时候,从来没有接触过函数式语言,对其了解只停留在“函数是first-class对象,可以像普通值一样传递”,仅此而已.后来,了解到.Net家族里的F#就是一种函数式语言,于是把玩了几下就搁浅了.再后来,C++新标准中纳入了Lambda表达式,支持了面向函数范式编程,于是又把玩了几下,感觉除了语法上跟C#略不同外,没什…
关于Y组合子,网上已经介绍很多了,其作用主要是解决匿名lambda的递归调用自己. 首先我们来看直观的递归lambda定义, 假设要定义阶乘的lambda表达,C#中需要这么定义 Func<int, int> fact = null; fact = x => x <= ? : x * fact(x - ); 这种方法非常简单直接,当然问题也存在,因为这里fact其实是一个委托对象,当这个对象改变后,可能就得不到阶乘的效果了. 在scala中则是这样, def F: Int =>…
递归.哦,递归. 递归在计算机科学中的重要性不言而喻. 递归就像女人,即令人烦恼,又无法抛弃. 先上个例子,这个例子里的函数double输入一个非负整数$n$,输出$2n$. \[ {double} = \lambda n.({if} \; ({iszero} \; n) \; 0 \; (+ \; 2 \; ({double} \; (- \; n \; 1)))) \] 现在的问题是,这个递归函数在我们的语言里没法直接定义. 我说的直接定义是指像这个用let表达式: \[ ({let} \;…
Y组合子 Y组合子的用处 作者:王霄池链接:https://www.zhihu.com/question/21099081/answer/18830200来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. Y组合子的用处是使得 lambda 表达式不需要名字. 如你所说,阶乘函数可以这样定义: let F = lambda n. n==0 ? 1 : n*(F n-1) 当我们需要调用的时候,我们只需要这样写就可以了: F 4 但你有没有想过,如果我们没有 let 这…
不动点组合子 Y = λf. (λx. f (x x)) (λx. f (x x)) θ = (λx. λy. (y(x x y))) (λx.λy.(y(x x y))) Y f = f (Y f) θ f = f (θ f)设 h1 =λx.f(x x) h2 =λx.λy.(y(x x y)) 简化为: Y = λf. h1(h1) θ = h2(h2) 递归求解ƒ(n) = n*ƒ(n-1)ƒ(0) = 1简记为: ƒ = λn.n׃(n-1) #ƒ对应代码中的 factorial用归…
函数式编程 阮一峰 <函数式编程初探>,阮一峰是<黑客与画家>的译者. wiki <函数编程语言> 一本好书,<计算机程序的构造与解释>有讲到scheme lisp, 不过是作为工具.重点还是再讲方法论,虽然只看了前言,已经觉得是非常好的书,非常有高度. 写这段话的人叫 艾伦佩利.他为这本书做的序,写的更好.非常有高度,非常有智慧,即使不读这本书,也推荐读一下序. <解释>是作为MIT的课程教材.其中提到了另一门课 6.231 可以作为该可的前导…