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. COGS 133. [USACO Mar08] 牛跑步

    ★★★   输入文件:cowjog.in   输出文件:cowjog.out   简单对比时间限制:1 s   内存限制:128 MB Bessie准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她 ...

  2. 洛谷 P2947 [USACO09MAR]仰望Look Up

    题目描述 Farmer John's N (1 <= N <= 100,000) cows, conveniently numbered 1..N, are once again stan ...

  3. 如何在Ubuntu 16.04上安装Apache Web服务器

    转载自:https://www.howtoing.com/how-to-install-the-apache-web-server-on-ubuntu-16-04 介绍 Apache HTTP服务器是 ...

  4. WPF中引入外部资源

    有时候需要在WPF中引入外部资源,比如图片.音频.视频等,所以这个常见的技能还是需要GET到. 第一步:在VS中创建一个WPF窗口程序 第二步:从外部引入资源,这里以引入图片资源为例 1)新建Reso ...

  5. 第三届上海市大学生网络安全大赛wp&学习

    wp 0x00 p200 先分析了程序关键的数据结构 分析程序逻辑,在free堆块的时候没有清空指针,造成悬挂指针,并且程序中给了system('/bin/sh'),可以利用uaf 脚本如下: 1.先 ...

  6. struts1标签库

    Struts提供了五个标签库,即:HTML.Bean.Logic.Template和Nested. HTML标签 : 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单 ...

  7. dubbo 多连接,多线程池.

    1. consumer 多连接 Dubbo protocol options: <dubbo:protocolname=“dubbo” port=“9090” server=“netty” cl ...

  8. shell脚本,对MySQL数据库进行分库加分表备份

    [root@localhost wyb]# cat table_backup.sh #!/bin/bash flag= user=root pass=test mysql -u$user -p&quo ...

  9. javase(3)_二叉树

    // 1.求二叉树中的节点个数 // 2.求二叉树的深度 // 3.前序遍历,中序遍历,后序遍历 // 4.分层遍历二叉树(按层次从上往下,从左往右) // 5.将二叉查找树变为有序的双向链表 // ...

  10. LeetCode 买卖股票的最佳时机

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...