Y Combinator
常见的例子
阶乘函数:
fact = (a) -> if a > 0 then a * fact(a - 1) else 1
问题的提出
如上,在fact函数中调用了fact本身,无法使用匿名函数表达,如何解决这一问题?
初步的尝试
初始的f:
f = (a) -> if a > 0 then a * f(a - 1) else 1
第一步,去除自身的递归调用:
f1 = (a) -> if a > 0 then a * f(a - 1) else 1
第二步,f1调用了f,将f提出,使得f'只依赖于输入:
f' = (f) -> (a) -> if a > 0 then a * f(a - 1) else 1
第三步,将f代入:
f' f = f
数学中,f(x)=x,此时x为f(x)的不动点;
同样的,f'(f)=f,此时f为f'的不动点。
此时,f(x)=f'(f(x)),接下来就是求f'。
进一步探索
当前的问题:求f'
令f=Y f',求解f与f'之间的关系。
这时有:
f = Y f'
进而有:
f = f' f = Y f' = f' Y f'
得出:
Y = f -> f Y f
故而我们需要求出Y组合子(Y Combinator)。
Y组合子
现成的Y组合子:
Y = f -> (x -> f x x) (x -> f x x)
证明:
Y g = (x -> g x x) (x -> g x x)
= (x -> g x x) (x -> g x x)
= g (x -> g x x) (x -> g x x)
= g Y g
其他组合子:
Z = f -> (x -> f (y -> x x y)) (x -> f (y -> x x y))
Y' = (x -> y -> x y x) (y -> x -> y x y x)
Θ = (x -> y -> y x x y) (x -> y -> y x x y)
问题的解决
对阶乘函数fact:
fact = (f) -> (a) -> if a > 0 then a * f(a - 1) else 1
有:
Y fact = fact Y fact
= (a) -> if a > 0 then a * (Y fact)(a - 1) else 1
这样,Y fact实现了和阶乘函数一样的功能。
可以写出:
fact = ((f) -> ((x) -> (n) -> (f x x)(n)) ((x) -> (n) -> (f x x)(n))) (f) -> (a) -> if a > 0 then a * f(a - 1) else 1
JS调用fact(5):
(function(f) {
return (function(h) {
return h(h)
})(function(x) {
return function(n) {
return f(x(x))(n)
}
})
})(function(f) {
return function(n) {
return n > 0 ? n * f(n - 1) : 1
}
})(5)
总结
综上可知,匿名函数可写成Y(f),f的类型为f->TInput->TResult,则Y的类型为(f->TInput->TResult)->TInput->TResult。
Y Combinator的更多相关文章
- YC(Y Combinator)斯坦福大学《如何创业》课程要点记录(粗糙)
20节课程,每节都是干货满满,时常听说理论无用,但是好的理论,绝对能帮助你少走一些弯路. YC简介: Y Combinator成立于2005年,是美国著名创业孵化器,Y Combinator扶持初创企 ...
- 如何猜出 Y combinator
先约定几个记号: 定义用一个冒号加等号表示":=", 表达式全等用两个等号表示"==", 归约意义上的相等用一个等号表示"="," ...
- y combinator 做的一个调查_可以学习一下
RoR: 在网络营运平台企业中,RoR站稳使用率第一的位置.其用户包括:ZenPayroll (人力资源).Asile50 (零售平台).BackerKit (众筹平台).Rainforest (QA ...
- 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代
2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...
- 【转】How to hire——创业公司应该如何招人
How to hire After startups raise money, their next biggest problem becomes hiring. It turns out it’ ...
- <转>简单之美——系统设计黄金法则
作者: 包云岗 发布时间: 2012-05-19 13:06 阅读: 3036 次 推荐: 1 原文链接 [收藏] 最近多次看到系统设计与实现的文章与讨论,再加上以前读过的其他资料以及自 ...
- [No000026]365种创业、办公、和生活成长的精华资源
只需要具备以下技能,人人都可以成为企业家:经得起失败的考验,思维活跃,新点子不断,能够脚踏实地把新点子转化为产品,并在这个过程中坚持不懈,百折不挠,即使跌倒了,也要及时从失败中学习,迅速投入到下一次冒 ...
- 使用Python的yield实现流计算模式
首先先提一下上一篇<如何猜出Y combinator>中用的方法太复杂了.其实在Lambda演算中实现递归的思想很简单,就是函数把自己作为第一个参数传入函数,然后后面就是简单的Lambda ...
- Jsoup解析Html中文文档
jsoup 简介Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTM ...
随机推荐
- 学习Git的总结与体会
学习Git的总结 blog 第一次学习Git是完全按照廖雪峰老师的教程学习的,学的过程中基本上没有遇到什么问题,但是自己实际操作就问题不断了. 首先,还是按照惯例,来膜拜一下廖雪峰老师精简的教程知识吧 ...
- python网络编程-socket
python提供了两个socket模块 Socket,它提供了标准的BSD Sockets API SocketServer,它提供了服务器中心类,可以简化网络服务器的开发 下面先说socket模块 ...
- 我的sql 记录
----------2017-01-03 21:56:56---------- --字符串分隔 start------------- use LDSQL GO CREATE function [dbo ...
- webpack详细配置讲解
//常见的Webpack配置文件var webpack = require('webpack');var HtmlWebpackPlugin = require('html-webpack-plugi ...
- 图片资源的加密和cocos2d-x中的解密
主要处理png图片,其他格式图片也是一样的原理.阅读前可以简略了解一下png格式图片的Data trunck. 首先使用python脚本去掉png的PNG SIG(8 bytes) 以及末尾的PNGI ...
- php : DOM 操作 XML
DOM 操作 XML 基本用法 XML文件: person.XML <?xml version="1.0" encoding="utf-8" ?> ...
- 安装升级npm依赖
npm-check 能够自动检索npm包版本,并且提供交互操作界面: 有以下功能: 1.告诉你那些依赖已经过时: 2.在你决定升级时,给你提供依赖包的文档: 3.提示某个依赖没有被你使用: 4.支持全 ...
- road习题(二)
答案:[C] 解析:2 8 原则,考虑的是最高峰,所以安装12小时算 ,80%的 PV 也就是访问都是在 早上6点到下午6点这12个小时里,晚上6点到早上6点的PV总量是40000 ,服务器台数为3, ...
- 主流的单元测试工具之-JAVA新特性-Annotation 写作者:组长 梁伟龙
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
- (原创)提取Xilinx开发工具的迅雷下载地址
①进入Xilinx官网,进入Device->Design Tools,选择你想要下载的任意工具. ②进入新web页面,右方点击“Downloads”.③进入版本选择页面,选择想要的版本号,点击相 ...