常见的例子

阶乘函数:

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的更多相关文章

  1. YC(Y Combinator)斯坦福大学《如何创业》课程要点记录(粗糙)

    20节课程,每节都是干货满满,时常听说理论无用,但是好的理论,绝对能帮助你少走一些弯路. YC简介: Y Combinator成立于2005年,是美国著名创业孵化器,Y Combinator扶持初创企 ...

  2. 如何猜出 Y combinator

    先约定几个记号: 定义用一个冒号加等号表示":=", 表达式全等用两个等号表示"==", 归约意义上的相等用一个等号表示"="," ...

  3. y combinator 做的一个调查_可以学习一下

    RoR: 在网络营运平台企业中,RoR站稳使用率第一的位置.其用户包括:ZenPayroll (人力资源).Asile50 (零售平台).BackerKit (众筹平台).Rainforest (QA ...

  4. 从直播编程到直播教育:LiveEdu.tv开启多元化的在线学习直播时代

    2015年9月,一个叫Livecoding.tv的网站在互联网上引起了编程界的注意.缘于Pingwest品玩的一位编辑在上网时无意中发现了这个网站,并写了一篇文章<一个比直播睡觉更奇怪的网站:直 ...

  5. 【转】How to hire——创业公司应该如何招人

    How to hire After startups raise money, their next biggest problem becomes hiring.  It turns out it’ ...

  6. <转>简单之美——系统设计黄金法则

    作者: 包云岗  发布时间: 2012-05-19 13:06  阅读: 3036 次  推荐: 1   原文链接   [收藏] 最近多次看到系统设计与实现的文章与讨论,再加上以前读过的其他资料以及自 ...

  7. [No000026]365种创业、办公、和生活成长的精华资源

    只需要具备以下技能,人人都可以成为企业家:经得起失败的考验,思维活跃,新点子不断,能够脚踏实地把新点子转化为产品,并在这个过程中坚持不懈,百折不挠,即使跌倒了,也要及时从失败中学习,迅速投入到下一次冒 ...

  8. 使用Python的yield实现流计算模式

    首先先提一下上一篇<如何猜出Y combinator>中用的方法太复杂了.其实在Lambda演算中实现递归的思想很简单,就是函数把自己作为第一个参数传入函数,然后后面就是简单的Lambda ...

  9. Jsoup解析Html中文文档

    jsoup 简介Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTM ...

随机推荐

  1. Java基础应用

    Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...

  2. [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)

    本系列导航 本系列其他文章目录请戳这里. 1.名字.约束时间(Binding Time) 在本篇博文开始前先介绍两个约定:第一个是“对象”,除非在介绍面向对象语言时,本系列中出现的对象均是指任何可以有 ...

  3. WinSCP无法连接 ubuntu 的解决方法

    ubuntu默认不安装sshd服务 需要sudo apt-get install ssh 你可以在ubuntu本机ssh localhost测试是否成功安装了ssh 因为WinSCP是基于ssh的sf ...

  4. 利用PhantomJS进行网页截屏,完美解决截取高度的问题

    关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS ...

  5. RabbitMQ 开启WEB管理

    rabbitmq-plugins 插件管理器 1.开启rabbitmq management  -  WEB管理插件 # rabbitmq-plugins enable rabbitmq_manage ...

  6. python http代理代码

    googlecode :https://code.google.com/archive/p/python-proxy/source/default/source # -*- coding: cp125 ...

  7. gradle相关配置内容解析

    gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...

  8. Linux内核创建一个新进程

    张雨梅   原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 创建新进程 如果同一个程序被多 ...

  9. Linux 命令——grep | 正则表达式

    感觉讲的很详细,瞬间懂了grep,正则. from: here 简介 grep (global search regular expression(RE) and print out the line ...

  10. 学习_单片机/嵌入式_的资源链接。——Arvin

    ---恢复内容开始--- +单片机 -郭天祥的51单片机入门视频(链接: https://pan.baidu.com/s/1sl3xNDr 密码: 1zik) -51单片机20元购买资料公开(链接: ...