《Clojure编程》笔记 第2章 函数式编程
背景简述
本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Clojure语言的。坊间传闻:通常情况下,最好是有一定Java的开发工作经验,再转CLojure可能容易一些。我入职后的实际经历也确实让我感受到了Clojure的自学难度略大于自学Java,遇到的困难主要与中文资料较少有关,具体为:
1 中文的面向新手的较为系统的教程材料较少,目前个人感觉最好用的还是《CLojure编程 Emerick著》这本书,网上应该很好找,如果大家没有电子版的话可以留言,我看到后就立刻分享给大家
2 中文的网上相关问题和讨论较少, 以前学Java的时候基本遇到的问题用百度就能解决,现在大概率要直接用bing或谷歌,或者直接在stackoverflow(虽然是英文的,但貌似是最好用的IT问答网站)上查
我的这个系列笔记主要是基于 0工作经验的后端开发转学Clojure 的场景下完成的,里面有一些个人观点和个人理解的注释,写的时候是为了便于自己理解相关的概念,现在分享出来一方面是希望能帮助像我一样的新手更好地理解,另一方面也是希望有高手能够发现错误并帮忙斧正,谢谢
一些格式的简单约定:
粗体:比较重要的内容
斜体:我个人理解/观点或是补充内容,大家选择性食用
P15:表示书上第15页
第2章 函数式编程
相较于第1章,第2章的内容较少,更偏向理论性,个人建议这部分可以先简单看一下了解即可,之后有一定经验了再看应该更容易理解一些。
状态: 在第1章的笔记中,关于状态是这么总结的:根据时间会发生变化的一种属性,某一状态一旦产生就不会再变化;本章加了个人觉得偏学术的描述,大家可以参考一下:一般是指应用中表示实体的所有标量变量以及聚合类型的数据结构,加上应用于外界所有联系的总和。一般的语言鼓励使用可变的状态,而函数式编程则鼓励使用不可变的对象,也就是值来表示程序的状态
值: 关键特性是不随着时间的改变而改变,具有不可变性,相较于使用可变状态,程序里面使用值越多,就越容易推断程序的行为,
值与可变对象的比较(为什么使用值): 暂时知道的是肯定可以降低代码维护难度,因为即便给一个集合添加了新的对象,原来的集合也不会被改变,而是产生了一个新的集合,使用不被限制的对象状态诸多风险,最主要的就是因为可被修改导致的用起来不安全
常用高阶函数:
- map:接受一个函数、一个或多个集合作为参数,返回一个序列作为结果,这个返回的序列是把函数应用到所有集合对应元素所得结果的一个序列
2.reduce:把一个集合应用一个函数而产生单个值的过程叫做归约,给定一个函数,以及一个要遍历的集合,reduce对每个元素都调用一下这个函数,并收集返回值,具体见P64
3.apply:应用,给定一个函数,以及相应的参数,然后再调用的过程被称为函数应用,这个能力对于函数式编程非常重要,因为有时要用的函数得在运行时通过上下文传入参数才能确定
4.partial:偏函数,把函数一部分参数先传给一个函数,创建一个新的函数,这个新函数需要的参数就是还未传入的剩余参数,有些函数需要一些配置才能工作的时候,就可以用偏函数
comp: 函数的组合,可以理解为comp是一个队列,一次执行函数,如何是comp(a b c),那么执行顺序是先c,再b,再a,P69
编写高阶函数: P72的这个例子值得好好看一下,以前我只觉得高阶函数更多的只是像一个函数的调用,但是这个例子能看出来,低阶函数被传入到下一步中,换句话说这个例子展示了低阶函数作为返回值的应用
纯函数: 纯函数没有副作用,不依赖于参数之外的任何东西,影响外部世界的唯一途径就是返回值,比如数学函数就是纯函数;一旦许诺编写纯函数,最终程序中大部分地方使用的都是不可变数据
副作用:依赖于环境或者改变环境都可以认为是有副作用
上一篇:《Clojure编程》笔记 第1章 进入Clojure仙境
下一篇:《《Clojure编程》笔记 第3章 集合类与数据结构
《Clojure编程》笔记 第2章 函数式编程的更多相关文章
- 20190825 On Java8 第十三章 函数式编程
第十三章 函数式编程 函数式编程语言操纵代码片段就像操作数据一样容易. 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许你 ...
- Python学习笔记(四)函数式编程
高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...
- 《Python 3.5从零开始学》笔记-第8章 面向对象编程
前几章包括开启python之旅.列表和元组.字符串.字典.条件和循环等语句.函数等基本操作.主要对后面几章比较深入的内容记录笔记. 第8章 面向对象编程 8.3深入类 #!/usr/local/bin ...
- [CSAPP笔记][第十一章网络编程]
第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...
- Python学习笔记(十一)—— 函数式编程
一.函数式编程理念 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变 ...
- Python实用笔记 (12)函数式编程——高阶函数
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...
- java并发编程笔记(一)——并发编程简介
java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...
- C#高级编程笔记之第二章:核心C#
变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...
- python3-cookbook笔记:第九章 元编程
python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...
随机推荐
- UltraEdit文字编辑器菜单热键推荐
键盘映射和自定义菜单热键 任何使用过UltraEdit / UEStudio一段时间的人都可能会告诉您,他们如此喜欢它的原因之一是"几乎所有东西都是可定制的".看一下产品鉴定,您会 ...
- Communicating to 2 SPI Slaves with USART & SPI ports on Atmega16U2
原文来自:https://www.avrfreaks.net/comment/2236256 I'm writing code for an embedded chip that consists o ...
- JavaFX FileChooser文件选择器,缓存上一次打开的目录
例1:点击按钮Choose File打开文件选择器,并打开指定的目录.这是通过final void setInitialDirectory(final File value)方法实现的. 1 impo ...
- LiteOS-任务篇-源码分析-系统启动函数
目录 前言 链接 参考 开启调度 LOS_Start 函数源码 osTickStart 函数源码 LOS_StartToRun 函数源码 前言 20201009 移植好内核后,开始实战内核. 源码分析 ...
- Python+Appium自动化测试(5)-appium元素定位常用方法
对于Android而言,查找appUI界面元素属性的工具有三种:appium desktop,uiautomatorviewer.bat,weditor.之前已经介绍过了weditor的使用,这里我将 ...
- 多测师讲解python_003.2练习题
# 1.分别打印100以内的所有偶数和奇数并存入不同的列表当中# 2.请写一段Python代码实现删除一个list = [1, 3, 6, 9, 1, 8]# 里面的重复元素不能用set# 3.将字符 ...
- 晋城6397.7539(薇)xiaojie:晋城哪里有xiaomei
晋城哪里有小姐服务大保健[微信:6397.7539倩儿小妹[晋城叫小姐服务√o服务微信:6397.7539倩儿小妹[晋城叫小姐服务][十微信:6397.7539倩儿小妹][晋城叫小姐包夜服务][十微信 ...
- 物联网wifi模块
物联网wifi模块 物联网wifi模块 是上海卓岚推出的MQTT+JSON转Modbus物联网WiFi核心模块.支持以MQTT的方式连接云端服务器,支持可以界面话配置,自主采集Modbus仪表/645 ...
- day25 Pyhton学习 MD5加密.日志
一.MD5加密 MD5是一种不可逆的加密算法. 它是可靠的. 并且安全的. 在python中我们不需要手写这一套算法. 只需要引入一个叫hashlib的模块就能搞定MD5的加密工作 import ha ...
- 习题3-5 谜题(Puzzle, ACM/ICPC World Finals 1993, UVa227)
#include<stdio.h> #include<string.h> char s[5][5]; int main() { while(gets(s[0])) { int ...