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。
转载于:https://www.cnblogs.com/bajdcc/p/5757410.html
Y Combinator相关推荐
- Y Combinator 创业课 2018 @北京
为了更好地与中国的创业公司交流,硅谷创业孵化器 Y Combinator(YC)首次登陆中国,并于 5 月 19 日在清华大学举办"Startup School 北京". &quo ...
- 每个创始人都需要了解的来自 Y Combinator 的 13 个见解
作者 | Jaryd Hermann 译者 | Arvin,责编 | 王晓曼 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 以下为译文: 前言 这是世界上第一大创 ...
- Y Combinator Is Boot Camp for Startups
可以看看别人都是如何思考的!原文地址:http://www.wired.com/magazine/2011/05/ff_ycombinator/all/1 Y Combinator Is Boot C ...
- Y combinator初创加速器2020冬季团队大赏——最好与最坏的时代
Photo from TechCrunch Y Combinator是一家投资种子阶段初创公司的创投公司,一年举办两场集合优质初创公司的demo day,只对特定的投资人和媒体开放,Airbnb和Tw ...
- YC指的是Y Combinator和陆奇
YC指的是Y Combinator(简称YC),是业界最著名.最有影响力的孵化器之一.YC的成功经验成为了众多创业公司和投资人追捧的典范,也成为了创业者们了解初创公司融资.交流经验的重要平台. YC的 ...
- 启动加速器比较:Y Combinator VS Techstars
by Weiting Liu 刘伟廷 启动加速器比较:Y Combinator VS Techstars (Startup Accelerator Comparison: Y Combinator V ...
- 【逻辑与计算理论】组合子逻辑与 Y 组合子
为什么是Y? 在前面的几个帖子里,我已经建立了如何把lambda演算变成一个有用的系统的点点滴滴. 我们已经有了数字,布尔值和选择运算符.我们唯一欠缺的是重复. 这个有点棘手.lambda演算使用递归 ...
- Y C夏季Demo Day最有趣的8家创业公司
在投资人和媒体齐聚的加州山景城的Y Combinator夏季Demo Day上有超过70家创业公司,他们都希望成为下一个Dropbox,AirBnB,我们从中挑出了8家比较有意思的公司来做一个简单的介 ...
- 拒绝平庸 保罗格雷厄姆_保罗·格雷厄姆(Paul Graham):微软无法处理Y组合器
拒绝平庸 保罗格雷厄姆 Earlier this month we wrote about a plan put forth by former Microsoft employee and curr ...
最新文章
- 前端project师养成记:开发环境搭建(Sublime Text必备插件推荐)
- 安装确认书模板_Aion S车讲堂 | 关于充电桩安装的N个问题
- Python的列表推倒式、生成器及迭代器
- linux 命令行模式下,浏览网页方法
- 苯(Benzene)
- 反编译android 状态栏沉浸,教程:反编译修改实现状态栏时间居左,去除锁屏运营商...
- centos 自动补全c语言,YouCompleteMe自动补全C语言大型项目 ycm
- Unity界面插件NGUI核心组件说明
- C#回车切换焦点实现实例解析
- 公司支付给临时工的劳务费,无法取得发票如何做账?
- mongodb adminmongo 使用过程中的一些小问题记录
- python程序的装修【文件可执行权限】【__name__】
- 十大经典排序算法(动图演示)-转载
- 权限管理框架之Shiro
- [JAVA网络编程]用Socket与网络调试助手(NetAssist)进行TCP通讯过程中遇到的问题
- 软件项目的招投标文件
- java简单幸运抽奖系统_java实现幸运抽奖系统
- 使用GDI/GDI+绘制到D3D9缓冲区的方法
- 算法探索_多序列合并去重
- arm64汇编adrp指令作用和使用举例
热门文章
- Linux入门第五集!MySQL8在Linux上的安装!MySQL的Linux资源分享!
- c#_将文件导入到工程目录下
- quartz java web_java web定时任务---quartz
- wps表格粗线和细线区别_学术论文表格制作方法解读
- python json模块有什么用_Python的json模块及使用
- asp.net多图片上传案例_会计小明的故事-成本核算案例篇
- linux patches工具,patch工具入门
- 免校准的电量计量芯片_万物互联,开启智慧计量新时代—2020年中国物联网计量创新发展论坛在济南举办...
- java c s 与b s架构结合使用_Java技术学习笔记:C/S 与B/S 区别
- BT5下用ncrack破解3389