大到可以小说的Y组合子(零)
问:啊!我想要一个匿名的递归…
答:Y(音同Why)…
… …
问:作为一位命令式语言的使用者,为什么会突然折腾起Y组合子呢?
答:的确,这事儿要从很久以前的几次搁浅开始说起…上学的时候,从来没有接触过函数式语言,对其了解只停留在“函数是first-class对象,可以像普通值一样传递”,仅此而已。后来,了解到.Net家族里的F#就是一种函数式语言,于是把玩了几下就搁浅了。再后来,C++新标准中纳入了Lambda表达式,支持了面向函数范式编程,于是又把玩了几下,感觉除了语法上跟C#略不同外,没什么特别之处,就又搁浅了。在此期间,断断续续一直有关注王垠的文章,从他的文章中了解到了Lisp,Scheme等更多关于FP的信息,以及一本值得每个程序员细读的好书——SICP(多希望读本科的时候就有这个觉悟——少打几盘Dota)。这本书已经拿到很久了,不过一直没有满怀虔诚地翻开。近来欲图浸洗一下自己堕落的灵魂,拂一拂书页上积满的灰尘,从此走上一条神(bu)圣(gui)之路…
问:似乎有点扯远了,不是说要谈谈Y组合子么?
答:哦,是的。最近在读SICP,打算用Scheme和F#完成课后习题。有天在把玩F#的时候,突发奇想:能不能用Lambda表达式(下文简称Lambda)写个递归呢?几番尝试,发现这个问题并不是一件天生简单的事情,经过一阵狂搜,方才对Y组合子有了比较全面的理解。
问:好吧,那现在就把讲台交给你,且听你如何剖析Y组合子,欢迎。(掌声四起)
答:大家好,这是我的第一篇博客园博文,在这里做个引子,欲深入了解Y组合子,且听下回分解…(臭鸡蛋,臭皮鞋满天飞)
大到可以小说的Y组合子(零)的更多相关文章
- 大到可以小说的Y组合子(一)
问:上回乱扯淡了一通,这回该讲正题了吧. 答:OK. 先来列举一些我参考过,并从中受到启发的文章. (1.)老赵的一篇文章:使用Lambda表达式编写递归函数 (2.)装配脑袋的两篇文章:VS2008 ...
- 大到可以小说的Y组合子(三)
答:关于Fix的问题你fix了吗? 问:慢着,让我想想,上次留下个什么问题来着?是说我们有了一个求不动点的函数Fix,但Fix却是显式递归的,是吧? 答:有劳你还记的这个问题. 问:Fix的参与背离了 ...
- 大到可以小说的Y组合子(二)
问:上一回,你在最后曾提到"抽象性不足",这话怎么说? 答:试想,如果现在需要实现一个其它的递归(比如:Fibonacci),就必须把之前的模式从头套一遍,然后通过fib_make ...
- Y组合子
Y组合子 Y组合子的用处 作者:王霄池链接:https://www.zhihu.com/question/21099081/answer/18830200来源:知乎著作权归作者所有.商业转载请联系作者 ...
- Lambda演算 - 简述Y组合子的作用
Y组合子:\f.(\x.f(xx))(\x.f(xx)),接受一个函数,返回一个高阶函数 Y组合子用于生成匿名递归函数. 什么叫匿名递归函数,考虑以下C语言递归函数 int sum(int n) { ...
- Racket中使用Y组合子
关于Y组合子,网上已经介绍很多了,其作用主要是解决匿名lambda的递归调用自己. 首先我们来看直观的递归lambda定义, 假设要定义阶乘的lambda表达,C#中需要这么定义 Func<in ...
- 简单易懂的程序语言入门小册子(4):基于文本替换的解释器,递归,如何构造递归函数,Y组合子
递归.哦,递归. 递归在计算机科学中的重要性不言而喻. 递归就像女人,即令人烦恼,又无法抛弃. 先上个例子,这个例子里的函数double输入一个非负整数$n$,输出$2n$. \[ {double} ...
- [学习] 从 函数式编程 到 lambda演算 到 函数的本质 到 组合子逻辑
函数式编程 阮一峰 <函数式编程初探>,阮一峰是<黑客与画家>的译者. wiki <函数编程语言> 一本好书,<计算机程序的构造与解释>有讲到schem ...
- 面向组合子设计Coder
面向组合子 面向组合子(Combanitor-Oriented),是最近帮我打开新世界大门的一种pattern.缘起haskell,又见monad与ParseC,终于ajoo前辈的几篇文章. 自去年9 ...
随机推荐
- Jquery与DOM对象
在第一次学习jquery中,常常会不能分辨DOM对象和Jquery对象,下面我们就简诉一下它们之间的关系和区别 1.DOM对象(Document Object Model) 文档对象模型,每一份DOM ...
- flush();close();dispose()
写一个写csv文件的程序,用streamwriter,觉得程序主体是没有问题的,但是一直写不进去,最后发现是因为没有调用flush(). msdn 对streamwriter.flush()的的说明是 ...
- NFinal学习笔记(一)
NFinal框架,最快的netWeb框架,其有三大特色,NFinalServer,NFinalBuild,NFinal代码生成器(生成web层) 首先学习了NFinalServer. NFinalSe ...
- Action重定向总结
[HttpPost] public ActionResult StudentList( string StudName, string studName, DateTime BirthDay, For ...
- android 5.0 受欢迎的API简介
android 5.0 作为系统的一次重大升级,给用户和开发者带来了全新的体验.Material Design不但在视觉和操作上更胜一筹,扩展UI工具包同时也引入了大量新的API. 1. 3D视图和实 ...
- Linux设置日期
$ date -s "2016-07-13 14:54" 把时间设置为2016-07-13 14:54
- ios--图片处理(修改、保存)UIGraphicsBeginImageContext
http://www.th7.cn/Program/IOS/201407/250904.shtml
- 查看Sql语句执行速度
原文链接:http://www.cnblogs.com/New-world/archive/2012/11/28/2793560.htmlMS_SQL模糊查询like和charindex的对比 lik ...
- python的and与or剖析
1.只含有and的表达式 In []: and True and ' Out[]: ' In []: and and True and 'long' Out[]: 从左向右,遇到False,则返回改值 ...
- css3绘制几何图形
用css3绘制你需要的几何图形 1.圆形 示例: 思路:给任何正方形元素设置一个足够大的 border-radius ,就可以把它变成一个圆形.代码如下: html: <div class=&q ...