Y-conbinator"有没有用"?并没有,在大多数支持函数式编程的语言里,你可以自由的使用递归,而这货只是作为理论基石弥散在函数式编程的血肉之中
这是数学笔记,这是数学笔记,这是数学笔记,和计算机半毛钱关系都没有,重要的话要说三遍(逃
 
1.λ-calculus
图灵一生开了好多脑洞,其中λ-calculus便是其中一个.(图灵说,要有一个和图灵机一样的世界,于是便有了λ-calculus)
λ-calculus的重要元素的便是λ表达式,在haskell中可以很方便的定义 比如(\x -> x+3) 它的意思便是定义一个f(x)=x+3,并且,这个函数是没有名字的!这点很重要(题外话在haskell中为什么是\呢,把眼镜脱掉你会觉的\和λ真的很难区别而后者在键盘上更难打233333)
图灵的写法是λx.x+3 然而这货事实上和f(x)=x+3没什么太大区别....λ表达式不那么高大上的说法是匿名函数,也就是对于一个函数它没有sin cos func 之类的名字,我们都叫红领巾(λ).要调用这个函数也很简单 比如 (λx.x+3 9) 等于12 理解上这和f(9)=12并没有太大区别
 
 
/**********************************************************************************
/* 数学上形式化定义是非常有用的,它避免了二义性,而自然语言却很容易出现.
/* 形式化描述:λ表达式可由递归定义
/* 1.一个变量x是一个λ表达式
/* 2.t是一个λ表达式,x是一个变量,那么(λx.t)是一个λ表达式
/* 3.茹果t s是λ表达式,那么(t s)也是λ表达式
/* 上面这段话写成bnf范式就是:(也就是你会在大部分中文资料中能找到的)
/* <expr> ::= <identifier>
/* <expr> ::= (λ <identifier> . <expr>)
/* <expr> ::= (<expr> <expr>)
/*
/* 其中第一二句定义了一个函数,第三句定义了一个调用
***********************************************************************************/
 
在定义了λ表达式后在上面定义了两条公理,α转化和β归约,(说人话:α转化就是f(x)=x*x 和f(y)=y*y 是一样一样的,β归约就是f(x)=x*x 那么f(5) 可以化成25(看起来很蠢的想法?实际上你学到的那么神奇的数论,也就是在皮亚诺公理系统5个看似很蠢的定义上导出))
注意到,其实原本由λ 表达式和两条公理...这个世界是没有数字的(比如某个热带雨林里的皮拉罕语语言中天生不存在数字,于是那一组的人民天生没有数字概念233333)也没有加减乘除,乘方,图灵不甘心,我造的世界怎么能这么不完美!于是图灵把我们世界的数字搬到了λ世界
皮亚诺是如何定义自然数的?首先要有一个头S,然后有它的后继SS以及它的后继SSS,SSSS....然后我们人为的把S记做 0 SS记做1 SSS记做2就可以了(事实上皮亚诺公理比这再稍微复杂一点,在此做了一些简化)
图灵把 λf.λx.x指派为0 λf.λx.f x指派为1 λf.λx.f(f x)为3依次类推事实上写成我们平时写惯的写法就是x是0 f(x)是1 f(f(x))是2...
有了数,便可以在上面定义加减乘除,这里不再赘述.
图灵把这些叫做丘奇编码,塞进了λ的世界,于是便有了数和四则运算,因此上面写的 λx.x+3才是正确的
 
 
是不是有点和哥德尔数有点像?哥德尔数把形式系统内的一切命题都和自然数做了一个双射,这样才能让后面命题G的自指成功,而图灵构造了一个集合使其和自然数构成双射,把自然数很自然的塞到了λ里,不得不说大师的脑洞总是惊人的相似
 
 
 
 
2.递归
有了自然数,剩下的好多东西都可以在λ-calculus的世界里定义了,于是图灵一下子把布尔数,选择结构等,通通在λ世界里找到了相应的表示方法表示.
比如if ,就可以在λ世界表示出来,我们知道if事实上就三个元素:表达式,如果表达式为真返回的值,如果表达式为假返回的值,那么就可以构造这样的λ表达式:let if = λ boolean a b.(boolean and a) or (not boolean and b) 比如 if (3>4) 3 4 =(false and 3) or (true and 4) = false or 4 = 4 注意这里的and or not不是位运算,而事实上haskell里if就的确就有返回值,就类似于一个函数.
终于有一个东西让他陷入了思考,递归
注意这里说递归和循环事实上差不多的的,尾递归和循环能够相互转化,编译器经常干这种事.
为什么塞不进呢?举个栗子.我们现在要实现阶乘函数,唔,用c写的话想法是这样的:int fac(int x){return (x==1)?1:x*fac(x-1);}
于是很容易的想法let fac = λx.if (x==1) 1 (x * fac x-1) 但是想想现代pc是怎样处理递归的?call 自己 就好了.call相当于push + jmp 也就是先把必要的参数push进栈里,然后jmp到调用函数的地址上.但是首先....call自己...call 自己...自己叫红领巾(大雾).....
匿名函数的性质决定了自己无论如何也是call不到自己的,而为啥能调用if 这里只是写着方便而已,相当于一个宏,只是为了书写方便,但你想把一个还没定义好的函数用什么替换呢?所以写递归在λ世界中,从来不是一件简单的事
 
 
3.不动点和Y-conbinator
-----------------------------------------------------------<未完待续 有空补(keng)>------------------------------------------------
 
 
reference:
byvoid函数式编程讲稿

haskell 乱搞(2)之 Y-conbinator [原创]的更多相关文章

  1. haskell 乱搞笔记[原创]

        脑洞时间:为什么世界上有那么多程序语言,那是腐朽的资本主义为了增加广大人民学习成本以及编译原理太过普及造成的,建议大学取消编译原理的一切课程,并挥起奥姆休的剃刀,把所有程序语言统统踢了,除机器 ...

  2. “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】

    黑白图像直方图 发布时间: 2017年7月9日 18:30   最后更新: 2017年7月10日 21:08   时间限制: 1000ms   内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ...

  3. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  4. UVA 11853 [dfs乱搞]

    /* 大连热身E题 不要低头,不要放弃,不要气馁,不要慌张 题意: 在1000×1000的格子内有很多个炮弹中心,半径给定. 为某人能否从西部边界出发,从东部边界走出. 不能输出不能,能的话输出最北边 ...

  5. 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

    3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 367  Solved: 159[Submit][Status][ ...

  6. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  7. BZOJ-1050 旅行comf 并查集+乱搞

    好久以前codevs上做过的,拿着改了改.. 1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2194 S ...

  8. BZOJ-1800 飞行棋 数学+乱搞

    这道题感觉就是乱搞,O(n^4)都毫无问题 1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1172 So ...

  9. CF_402C Searching for Graph 乱搞题

    题目链接:http://codeforces.com/problemset/problem/402/C /**算法分析: 乱搞题,不明白题目想考什么 */ #include<bits/stdc+ ...

随机推荐

  1. Actionbar Demo

    源码下载:http://download.csdn.net/detail/bx276626237/8874119

  2. Kubernetes里的ConfigMap的用途

    顾名思义,ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件. ConfigMap同Kubernetes的另一个概念secret类似,区别是ConfigMap主要 ...

  3. Kubenetes里pod和service绑定的实现方式

    我之前的文章 如何在Kubernetes里创建一个Nginx service介绍了如何创建一个Kubernetes pod和service,使用的方法是命令kubectl run. 本文介绍另一种方式 ...

  4. Session 机制和 Cookie 机制

    Session 机制和 Cookie 机制 HTTP协议是无状态的, 而Cookie和Session都是在无状态的基础上希望实现有状态的效果, 两者是在客户端或者是服务端使用缓存等手段来实现状态的维护 ...

  5. couldn't be opened because you don't have permission to view it” 解决方法

    I use Xcode6 GM. I encountered the same problem. What I did was to go to Build Options. Then I chang ...

  6. HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场

    题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...

  7. Robot Framework(十一) 执行测试用例——后处理输出

    3.3后处理输出 在测试执行期间生成的XML输出文件可以在之后由rebot工具进行后处理,该工具是Robot Framework的组成部分.在测试执行期间生成测试报告和日志时会自动使用它,但在执行后也 ...

  8. [Android 测试] 压力稳定性测试之: Monkey 详解分析脚本(转载)

    一.什么是稳定性测试? 通过随机点击屏幕一段时间,看看app会不会奔溃,能不能维持正常运行. 二. Money是什么? Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模 ...

  9. php微信开发自动回复一直提示“该公众号提供的服务出现故障,请稍后再试”

    坑:服务器可以接受到发到公众号的信息,但是公众号不能回复,直接echo " ";exit();也会提示“该公众号提供的服务出现故障,请稍后再试”: 可能原因:用的php,是把数组转 ...

  10. 洛谷 P2846 光开关

    https://www.luogu.org/problemnew/show/P2846 好多题解用线段树来写,然而分块不是更简单好些吗? 一个数组use记录这一块进行了多少次开关操作,两边单独计算,注 ...