常见的例子

阶乘函数:

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相关推荐

  1. Y Combinator 创业课 2018 @北京

    为了更好地与中国的创业公司交流,硅谷创业孵化器 Y Combinator(YC)首次登陆中国,并于 5 月 19 日在清华大学举办"Startup School 北京". &quo ...

  2. 每个创始人都需要了解的来自 Y Combinator 的 13 个见解

    作者 | Jaryd Hermann 译者 | Arvin,责编 | 王晓曼 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 以下为译文: 前言 这是世界上第一大创 ...

  3. Y Combinator Is Boot Camp for Startups

    可以看看别人都是如何思考的!原文地址:http://www.wired.com/magazine/2011/05/ff_ycombinator/all/1 Y Combinator Is Boot C ...

  4. Y combinator初创加速器2020冬季团队大赏——最好与最坏的时代

    Photo from TechCrunch Y Combinator是一家投资种子阶段初创公司的创投公司,一年举办两场集合优质初创公司的demo day,只对特定的投资人和媒体开放,Airbnb和Tw ...

  5. YC指的是Y Combinator和陆奇

    YC指的是Y Combinator(简称YC),是业界最著名.最有影响力的孵化器之一.YC的成功经验成为了众多创业公司和投资人追捧的典范,也成为了创业者们了解初创公司融资.交流经验的重要平台. YC的 ...

  6. 启动加速器比较:Y Combinator VS Techstars

    by Weiting Liu 刘伟廷 启动加速器比较:Y Combinator VS Techstars (Startup Accelerator Comparison: Y Combinator V ...

  7. 【逻辑与计算理论】组合子逻辑与 Y 组合子

    为什么是Y? 在前面的几个帖子里,我已经建立了如何把lambda演算变成一个有用的系统的点点滴滴. 我们已经有了数字,布尔值和选择运算符.我们唯一欠缺的是重复. 这个有点棘手.lambda演算使用递归 ...

  8. Y C夏季Demo Day最有趣的8家创业公司

    在投资人和媒体齐聚的加州山景城的Y Combinator夏季Demo Day上有超过70家创业公司,他们都希望成为下一个Dropbox,AirBnB,我们从中挑出了8家比较有意思的公司来做一个简单的介 ...

  9. 拒绝平庸 保罗格雷厄姆_保罗·格雷厄姆(Paul Graham):微软无法处理Y组合器

    拒绝平庸 保罗格雷厄姆 Earlier this month we wrote about a plan put forth by former Microsoft employee and curr ...

最新文章

  1. 前端project师养成记:开发环境搭建(Sublime Text必备插件推荐)
  2. 安装确认书模板_Aion S车讲堂 | 关于充电桩安装的N个问题
  3. Python的列表推倒式、生成器及迭代器
  4. linux 命令行模式下,浏览网页方法
  5. 苯(Benzene)
  6. 反编译android 状态栏沉浸,教程:反编译修改实现状态栏时间居左,去除锁屏运营商...
  7. centos 自动补全c语言,YouCompleteMe自动补全C语言大型项目 ycm
  8. Unity界面插件NGUI核心组件说明
  9. C#回车切换焦点实现实例解析
  10. 公司支付给临时工的劳务费,无法取得发票如何做账?
  11. mongodb adminmongo 使用过程中的一些小问题记录
  12. python程序的装修【文件可执行权限】【__name__】
  13. 十大经典排序算法(动图演示)-转载
  14. 权限管理框架之Shiro
  15. [JAVA网络编程]用Socket与网络调试助手(NetAssist)进行TCP通讯过程中遇到的问题
  16. 软件项目的招投标文件
  17. java简单幸运抽奖系统_java实现幸运抽奖系统
  18. 使用GDI/GDI+绘制到D3D9缓冲区的方法
  19. 算法探索_多序列合并去重
  20. arm64汇编adrp指令作用和使用举例

热门文章

  1. Linux入门第五集!MySQL8在Linux上的安装!MySQL的Linux资源分享!
  2. c#_将文件导入到工程目录下
  3. quartz java web_java web定时任务---quartz
  4. wps表格粗线和细线区别_学术论文表格制作方法解读
  5. python json模块有什么用_Python的json模块及使用
  6. asp.net多图片上传案例_会计小明的故事-成本核算案例篇
  7. linux patches工具,patch工具入门
  8. 免校准的电量计量芯片_万物互联,开启智慧计量新时代—2020年中国物联网计量创新发展论坛在济南举办...
  9. java c s 与b s架构结合使用_Java技术学习笔记:C/S 与B/S 区别
  10. BT5下用ncrack破解3389