《Clojure编程》笔记 第2章 函数式编程
阅读原文时间:2023年07月08日阅读:1

目录

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

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

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

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

一些格式的简单约定:

粗体:比较重要的内容

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

P15:表示书上第15页

相较于第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章 集合类与数据结构