背景简述

本人是一个自学一年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. module(JS模块系统)

    JS - module(模块系统) 重新学习ES6 倒数第一章 module 什么是module? 百度的解释 之前接触过AngularJS,现在看Dojo,都有对模块的使用.在dojo官网看到这段文 ...

  2. “工程师思维” VS. “学院派思维”

    1.与"工程师"交流,他们致力于"更快.高质量"交付,他们会借助时下最稳定.最完善的中间件或者框架,他们更谦虚,喜欢和志同道合的朋友交流分享协作,视角更宽,往往 ...

  3. Java知识系统回顾整理01基础05控制流程03 while

    while和do-while循环语句 一.while:条件为true时 重复执行 只要while中的表达式成立,就会不断地循环执行 public class HelloWorld { public s ...

  4. MyEclipse 设置打开 jsp 文件的默认编辑器

    MyEclipse 版本信息 MyEclipse Enterprise Workbench Version: 2014 Build id: 12.0.0-20131202 菜单 Window > ...

  5. RTKLIB的主要功能

    RTKLIB是全球导航卫星系统GNSS(global navigation satellite system)的标准&精密定位开源程序包,RTKLIB由日本东京海洋大学(Tokyo Unive ...

  6. c#类(class)

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

  7. vue-integer-plusminus

    下载 vue-integer-plusminusvue-integer-plusminus 带有递增和递减按钮的整数输入 现场演示 该组件适合作为自旋按钮,允许键盘功能(向上/向下箭头或页面向上/向下 ...

  8. 远程触发Jenkins的Pipeline任务的并发问题处理

    前文概述 本文是<远程触发Jenkins的pipeline任务>的续篇,上一篇文章实战了如何通过Http请求远程触发指定的Jenkins任务,并且将参数传递给Jenkins任务去使用,文末 ...

  9. Linux init 详解(0,1,2,3,4,5,6)

    一.什么是 init init是Linux系统操作中不可缺少的程序之一. 所谓的init进程,它是一个由内核启动的用户级进程. 内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数 ...

  10. rxjs入门3之项目中ajax函数封装

    项目中ajax函数封装 ⽹页应⽤主要数据源有两个:⼀个是⽹页中的DOM事件,另⼀个就是通过AJAX获得的服务器资源.我们已经知道fromEvent这个操作符可以根据DOM事件产⽣Observable对 ...