函数式入门圣经——王垠力荐《The Little Schemer》

除了在知乎看到过一两次,首次正式得知《The Little Schemer》此书则是来自王垠的博客:

Dan Friedman 是 Indiana 大学的教授,程序语言领域的创始人之一。他主要的著作《The Little Schemer》(前身叫《The Little Lisper》) 是程序语言界最具影响力的书籍之一。现在很多程序语言界的元老级人物,当年都是看这本 “小人书” 学会了 Lisp/Scheme,才决心进入这一领域。

怼天怼地的王垠,在 GTF - Great Teacher Friedman 不遗余墨的表达了对 Dan Friedman 敬重与感激,文中满是对这位好老师的感激之情与知遇之恩。

恰逢我又在重新看 SICP,对,就是那本看起来不厚,习题多得要命的那本 Structure and Interpretation of Computer Programs(计算机程序的构造和解释)。当然这本书的赞誉满如繁星:https://www.zhihu.com/question/26549715/answer/34336593

过多的习题实在没有耐心,难以坚持,于是就先试试看《The Little Schemer》。

我在寒假中已把《The Little Schemer》看完,收获良多,如今重温一下,顺便写本书评。

相对于 SICP ,我更推荐各位先看《The Little Schemer》打打基础,当这是一个 tutorial,其一问一答式的写作方法会令你耳目一新的-------讲的更加循循善诱,鞭辟入里,而且没什么习题 - -。你可以很快就了解到怎么样写 scheme,递归的威力,以及了解怎么样写一个 scheme 解释器,顺带了解了 丘奇计数,y 组合子等。

我顺带在这里整理下这本书讨论了啥:

玩具总动员

引入scheme 中基本元素atom(原子), list(列表), car(取列表的第一项),cdr(取列表除第一项的余下作为列表),cons(把 a 元素加到 b 列表中),null?(判断是否为空) , eq?(是否相等)。

以上就是全部了,之后的所有东西就靠以上关键字实现,包括 sheme 解释器,y 组合子,删除列表第 x 项元素。

处理,处理,反复处理。。。

引入函数lambda以及or 关键词(if lese 作用),引入递归概念,实现函数lat?(判断列表里是否全为atom 原子),member?(列表是否包含xx)等为例子。

用 cons 构筑恢宏

通过实现 rember(删除列表某元素)引入 cons 构建/拼接列表,实现 first(取列表第一项),实现 insertR(在列表的某项后插入一个元素),multiinsertR(在列表的某项后插入一个列表内所有元素——听到这个用递归做是否就有点不习惯了呢)。

此章主要通过实现更多的函数,让读者更加熟悉递归实现函数的思维,以及如何写递归终止条件。

数字游戏

实现数字中的 +-*/等方法,就是自己来做数字的这些功能,可能这样说对没有接触过丘奇计数的人有点奇怪,我举一个我在阿里校招中出过的一道面试题为例子:

以下C 语言程序的输出是什么?

#include <stdio.h>
int lambda(a, b) {if(a == 0) {return b;}else {a = a - 1;b = b + 1;return lambda(a, b);}
}int mull_r(a, b) {if(a == 0) {return 0;}else {a = a - 1;return lambda(b, mull_r(a, b)) ;}
}int main()
{int a = 88888;int b = 11111;printf("%d\n", lambda(a, b));int c = 300;int d = 400;printf("%d\n", mull_r(c, d));return 0;
}

A. 77777 120400

B. 99999 120000

C. 99998 120100

D. 99999 119600

答案是 B,以上 C 语言就是简单的实现了 + , - 功能(某种程度上)。

同理还实现了=<以及>,无非就是 a,b 同时递归-1,看谁先为 0之类。

接着就是实现 len(列表长度),all-nums(提取列表中所有数字),one?(判断 n是否为 1)等。

我的天!都是星星

此章中重新实现以前实现过的函数的泛化版本(都在函数名后加一个*,所以说都是星星)。

比如rember*(这次接受的第二个参数不是原子了,是列表,列表中出现过的都要删掉);insertR*(同理)等, eqlists(判断两个列表是否全等)。就是参数都为列表了,让递归来的更猛烈一些。

如影随形

引入算术表达式,如 1+33*4+12 等并写算术表达式解释器,算出结果。

另外,值得一提的是又提了一遍丘奇数,如:

4 代表概念上的四。因为人们更习惯阿拉巴表示法,所以我们选择了这个符号。

但,(() () () ())也有同样效果,(I V)也可以。

我们可以用() 代表 0, 1就是 ( () ),2 就是(()())

那么加法就可以用 cons 做列表拼接 (cons (quote()) (quote()) ) 结果就是(())也就是 1。

作者最后用了一个函数lat来说明在做高级抽象时应该注意不适用的陷阱(阴影),也就是本章标题的含义。

朋友及关系

写一个 set?函数(判断列表是否为 set也就是没有重复出现的元素),makeset(从列表中构建一个 set),subset(b 是否 a 的子集),eqset?interset?等。

示例了如何抽象出一个子过程(函数),来增强代码的表达能力。

lambda 终结者

在把函数当做数据类型,作为参数传入函数使用时,引入 Curry-ing(柯里化)的概念:

(lambda (a)(lambda (x)(eq? x z))
)

如上,传入参数 apple 的时候,会返回函数

    (lambda (apple)(eq? apple z))

如上就可以构造出一个函数,传给 rember函数(根据条件删除列表中元素)作为参数使用。

接着用这个抽象更高一层的函数,因为年代久远,我有些忘了。。这里描述不了了。

####。。。。周而复始。。。

这一章,作者从无到有的推导出在没有定义函数名字的时候,怎么样实现递归,也即是 Y conbinator(Y 组合子)的来由,然而实在让人头大,我看了好多遍,也只是似是而非,不能鞭辟入里的讲解出来,所以我算是不懂的。

值是什么

有了递归,有了之前写过的数字表达式解释器,而 scheme 本来就很简单,于是这一章就可以总结之前学到的所有东西,写一个 scheme 解析器了。


以上就是《The Little Schemer》的内容,对于一个刚入门学计算机的,没有接触过函数式编程的,我是极力推荐的。

努力学完理解完,一周时间勉强可以解决了,之后两章可能需要花比较长的时间去理解——难度暴涨。。。需要自己去多看看其他书了。

其实理解完除了最后两章的内容,上手 SICP 就非常简单了,只不过习题还需多加努力。

看 SICP 不如先看 The Little Schemer相关推荐

  1. hm55主板支持最大内存_内存频率取决于CPU还是主板?内存频率看主板支持还是看CPU支持?...

    内存频率取决于CPU还是主板还是内存自身?高频内存在日常使用确实感受不到性能差异,不过在部分游戏中,确实对游戏帧数有一定的提升.对于准备新装机用户,不少用户发现CPU和主板都有内存支持频率参数,可能有 ...

  2. Android开发必看知识,不看后悔

    Android开发必看知识,不看后悔 打包为大家奉上最实用最给力的资源,不看你绝对后悔. 最强大的UI特效 奇艺高清UI界面源代码 http://www.eoeandroid.com/thread-1 ...

  3. 微信「看一看」 朋友在看的增强推荐系统

    本文基于ECML-PKDD-2020论文<Social Influence Attentive Neural Network for Friend-Enhanced Recommendation ...

  4. (转)看盘ABC:看盘七大指标

    (转)看盘ABC:看盘七大指标 投资大师巴菲特说过一句话:投资是一场马拉松赛,获得冠军的前提是要跑完全程.在这场马拉松赛中,您能跑完全程吗?以往无数股民的经历表明,中途惨败出局者不计其数.为了让自己获 ...

  5. 不知道工作组名称怎样加入_黄瓜汁加入适量的蜂蜜功效竟然这么好!不看不知道,一看吓一跳!_人类...

    原标题:黄瓜汁加入适量的蜂蜜功效竟然这么好!不看不知道,一看吓一跳! 黄瓜汁加入适量蜂蜜以后,味道略甜,口感特别好,是人们特别喜欢喝的一种健康饮品,其实黄瓜汁加蜂蜜不但会让它的口感变好,还会让它营养价 ...

  6. spyder 怎么看函数定义_看漫画学C++035:自定义函数(1)

    点击蓝字 关注我们 本话内容 请输入 计算中编程中的函数可以理解为是一种子程序,子程序是一个大型程序中的某部分代码,由一个或多个语句块组成.它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性 ...

  7. 盛世看增长,乱世看效率 from 思维碎片@知识星球

    我的知识星球开了3年,一直没好好运营,只是时不时说几句碎碎念,今天挑一些分享一下吧. ---- 强制是通过威胁减少人们的选择权来促成协作,说服是通过承诺扩大人们的选择权来促成协作. 搞定需求只是占个了 ...

  8. 2013年10月22日、|充实自己|看书看到恶心看教学视频看到吐|也许旷几次课也是值得的

    |充实自己| 看书看到恶心看教学视频看到吐 |也许旷几次课也是值得的

  9. 台式计算机的配置怎么看,台式电脑配置怎么看

    电脑的性能.价格决定于电脑的配置,很多人电脑新手在购买电脑的时候对电脑配置的相关情况不太了解,导致新买的电脑频频出问题,所以了解自己电脑配置是很重要的,这里我们就简单的来说说台式电脑配置怎么看. 电脑 ...

  10. 长短视频平台内卷自制剧,网剧制作商耐看娱乐能“耐看”吗?

    随着智能手机和移动互联网的普及,刷剧已成为大众普遍的娱乐方式之一,不少网友沉迷在刷剧的世界里.在微博话题#无数次熬夜的原因#中,最高赞的回答便是"再看一集就睡",足以见得剧集的魅力 ...

最新文章

  1. 移动端导航页面html,swiper4实现移动端导航切换
  2. 为何Google将几十亿行源代码放在一个仓库?| CSDN博文精选
  3. 平滑无损!引入Elasticsearch的系统架构实战
  4. linux与开发板串口通信
  5. 两人团队项目-石家庄地铁查询系统(web版)
  6. Azkaban-two_server模式-job任务运行
  7. CityEngine如何生成隧道
  8. Handler(2)
  9. 从濒临解散到浴火重生,OceanBase 这十年经历了什么?
  10. linux centos erlang,CentOS 7.7安装Erlang和Elixir
  11. flash百叶窗消失_flash遮罩特效实例---百叶窗效果
  12. 微信公众号回复消息换行符处理
  13. Linux Capability探索试验
  14. 地理信息可视化大数据系统分析
  15. 类360极速浏览器官网html
  16. 物联网中使用了哪些技术?
  17. 让ChatGPT成为你的人工智能好友
  18. 图解 Paxos 一致性协议
  19. Cesium 车辆跟踪事件气泡弹窗追随
  20. 用Python对两个数据集中的图像进行水平拼接

热门文章

  1. 多进程统计策略盈亏分布——从零到实盘12
  2. 共享编辑文档系统dzzoffice安装
  3. Create user中采用externally操作系统认证方式详解
  4. 神器 | 百度云资源搜索
  5. Oracle Data Integrator(ODI)架构
  6. 手机计算机里面的符号代表什么意思,计算器上的符号各代表什么意思?
  7. 我在南方的艳阳里大雪纷飞
  8. 数据库知识整理 - 并发控制(封锁、两段锁协议、意向锁)
  9. 获取远程资源提示msxml3.dll指定资源下载失败
  10. mysql 约束 分类,MySQL约束类型及举例介绍