背景简述

本人是一个自学一年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. (转载)浏览器 user-agent 字符串的故事

    本文转载自:http://www.cnblogs.com/ifantastic/p/3481231.html. 如有侵权,请联系处理!   你是否好奇标识浏览器身份的User-Agent,为什么每个浏 ...

  2. 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)

    091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. Java知识系统回顾整理01基础01第一个程序05Eclipse中运行Java程序

    一.打开Java文件 直接打开在 命令行Hello World 中创建的java 文件 HelloWorld.java 二.运行 点击绿色运行按钮,直接运行 在eclipse中,编译过程自动执行了 三 ...

  4. 洛谷比赛 「EZEC」 Round 4

    洛谷比赛 「EZEC」 Round 4 T1 zrmpaul Loves Array 题目描述 小 Z 有一个下标从 \(1\) 开始并且长度为 \(n\) 的序列,初始时下标为 \(i\) 位置的数 ...

  5. Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多

    在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...

  6. 跟着动画学习 TCP 三次握手和四次挥手

    TCP三次握手和四次挥手的问题在面试中是最为常见的考点之一.很多读者都知道三次和四次,但是如果问深入一点,他们往往都无法作出准确回答. 本篇尝试使用动画来对这个知识点进行讲解,期望读者们可以更加简单地 ...

  7. roles学习笔记(模拟安装httpd服务)

    这是目录(app 是模拟的角色) [root@test ansible]# tree.├── app_role.retry├── app_role.yml├── httpd_role.yml├── n ...

  8. lora网关

    lora网关 lora物联网网关ZLAN9743可以实现RS232/485/422/以太网转 LoRa功能 是一款高性价比远距离无线通讯网关.LoRa和GPRS.4G方案相比它无需入网月租费,和Wif ...

  9. day30 Pyhton 面向对象 反射

    @property # 例1 - 1 (某一个属性如果是通过计算得来的,那么计算的过程写在方法里,把这个方法伪装成属性) from math import pi # class Circle: # d ...

  10. svn:E170001:Authorization failed解决

    eclipse添加svn资源库:打开eclipse→Window→SVN资源库→空白处右键新建资源库位置→填写正确的URL→finish 错误信息: 原因一:用户名或密码错误 因svn登录验证的账号信 ...