背景简述

本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Clojure语言的。坊间传闻:通常情况下,最好是有一定Java的开发工作经验,再转CLojure可能容易一些。我入职后的实际经历也确实让我感受到了Clojure的自学难度略大于自学Java,遇到的困难主要与中文资料较少有关,具体为:

1 中文的面向新手的较为系统的教程材料较少,目前个人感觉最好用的还是《CLojure编程 Emerick著》这本书,网上应该很好找,如果大家没有电子版的话可以留言,我看到后就立刻分享给大家

2 中文的网上相关问题和讨论较少, 以前学Java的时候基本遇到的问题用百度就能解决,现在大概率要直接用bing或谷歌,或者直接在stackoverflow(虽然是英文的,但貌似是最好用的IT问答网站)上查

我的这个系列笔记主要是基于 0工作经验的后端开发转学Clojure 的场景下完成的,里面有一些个人观点和个人理解的注释,写的时候是为了便于自己理解相关的概念,现在分享出来一方面是希望能帮助像我一样的新手更好地理解,另一方面也是希望有高手能够发现错误并帮忙斧正,谢谢

一些格式的简单约定:

粗体:比较重要的内容

斜体:我个人理解/观点或是补充内容,大家选择性食用

P15:表示书上第15页

第2章 函数式编程

相较于第1章,第2章的内容较少,更偏向理论性,个人建议这部分可以先简单看一下了解即可,之后有一定经验了再看应该更容易理解一些。

状态: 在第1章的笔记中,关于状态是这么总结的:根据时间会发生变化的一种属性,某一状态一旦产生就不会再变化;本章加了个人觉得偏学术的描述,大家可以参考一下:一般是指应用中表示实体的所有标量变量以及聚合类型的数据结构,加上应用于外界所有联系的总和。一般的语言鼓励使用可变的状态,而函数式编程则鼓励使用不可变的对象,也就是值来表示程序的状态

值: 关键特性是不随着时间的改变而改变,具有不可变性,相较于使用可变状态,程序里面使用值越多,就越容易推断程序的行为,

值与可变对象的比较(为什么使用值): 暂时知道的是肯定可以降低代码维护难度,因为即便给一个集合添加了新的对象,原来的集合也不会被改变,而是产生了一个新的集合,使用不被限制的对象状态诸多风险,最主要的就是因为可被修改导致的用起来不安全

常用高阶函数:

  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章 函数式编程的更多相关文章

  1. 20190825 On Java8 第十三章 函数式编程

    第十三章 函数式编程 函数式编程语言操纵代码片段就像操作数据一样容易. 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许你 ...

  2. Python学习笔记(四)函数式编程

    高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...

  3. 《Python 3.5从零开始学》笔记-第8章 面向对象编程

    前几章包括开启python之旅.列表和元组.字符串.字典.条件和循环等语句.函数等基本操作.主要对后面几章比较深入的内容记录笔记. 第8章 面向对象编程 8.3深入类 #!/usr/local/bin ...

  4. [CSAPP笔记][第十一章网络编程]

    第十一章 网络编程 我们需要理解基本的客户端-服务端编程模型,以及如何编写使用因特网提供的服务的客户端-服务端程序. 最后,我们将把所有这些概念结合起来,开发一个小的但功能齐全的Web服务器,能够为真 ...

  5. Python学习笔记(十一)—— 函数式编程

    一.函数式编程理念 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变 ...

  6. Python实用笔记 (12)函数式编程——高阶函数

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 变量 ...

  7. java并发编程笔记(一)——并发编程简介

    java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...

  8. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

  9. python3-cookbook笔记:第九章 元编程

    python3-cookbook中每个小节以问题.解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构.函数.类等特性在某类问题上如何更好地使 ...

随机推荐

  1. Linux ALSA 音频库 配置和使用

    ALSA应用库是核心功能,而alsa-utils是一些工具功能集合库.单纯地播放一个wav文件,使用alsa-utils即可,如果还需要合成音频.调试音频质量,那么就需要ALSA应用库. 欲安装使用A ...

  2. linux centos7使用docker安装elasticsearch,并且用Django连接使用

    一:elasticsearch安装及配置 1:需求分析 当用户在搜索框输入关键字后,我们要为用户提供相关的搜索结果.这种需求依赖数据库的模糊查询like关键字可以实现,但是like关键字的效率极低,而 ...

  3. 【题解】[SDOI2017]数字表格

    Link #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e6; in ...

  4. [POI2009]ARC-Architects

    [POI2009]ARC-Architects 题意: 给定一个序列,从中挑选k个数,满足下标单调递增,并且字典序最小: 思路: 由于字典序最小,所以考虑贪心,即前面的数尽可能大,所以用单调队列维护最 ...

  5. c#类(class)

    类 类的定义是以关键字class开始的,后面跟类的名称,类的主题包含一个花括号里,下面是类定义的一般格式. <access specifier> class class_name { // ...

  6. 手把手教你使用 Prometheus 监控 JVM

    概述 当你的 Java 业务容器化上 K8S 后,如果对其进行监控呢?Prometheus 社区开发了 JMX Exporter 来导出 JVM 的监控指标,以便使用 Prometheus 来采集监控 ...

  7. 非阻塞I/O和阻塞I/O

    1.简介 等待队列实现在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权.可用于: - 中断处理 - 进程同步 - 定时 2.等待队列头数据结构 1 typedef st ...

  8. 【Jenkins】远程调用jenkins进行构建方式!

    前提:jenkins支持远程调用(具体设置自行百度)1.在我的个人中心--configure--API TOKEN--如果没有,则添加一个token,并生成,再复制并记录下来2.在你的job上面加上你 ...

  9. springMvc配置拦截器无效

    说明 springMvc配置国际化拦截器失败,点击页面按钮切换中英文无效,排查发现没有进入 LocaleChangeInterceptor 类中,判断拦截器没有起作用,那么是什么原因导致拦截器无效,通 ...

  10. 远程IO

    远程io 远程io ZLAN6842,ZLAN6844是8路远程O控制器.含有8路DI.8路DO,8路AI输入.其中DI支持干节点和湿节点,带光耦隔离:DO为继电器输出,具有5A 250VAC或5A ...