草庐IT

读函数式编程思维笔记02_转变思维

躺柒 2023-03-28 原文

1. 命令式编程

1.1. 按照“程序是一系列改变状态的命令”来建模的一种编程风格

1.2. 传统的for循环

1.2.1. 确立初始状态

1.2.2. 每次迭代都执行循环体中的一系列命令

1.2.2.1. 将操作安排在循环内部去执行

1.3. Java

1.3.1. 消除了垃圾收集的麻烦

2. 函数式编程

2.1. 程序描述为表达式和变换,以数学方程的形式建立模型,并且尽量避免可变的状态

2.2. 不会用很多抽象,但每个抽象的泛化程度都很高(特化的方面通过高阶函数注入)

2.3. 以参数传递和函数的复合作为主要的表现手段

2.4. 不需要掌握太多作为“不确定因素”存在的其他语言构造之间的交互规则

2.5. 操作(filter、transform、convert),每一种都作为一个逻辑分类由不同的函数所代表,这些函数实现了低层次的变换,但依赖于开发者定义的高阶函数作为参数来调整其低层次运转机构的运作

2.6. 好处

2.6.1. 换一种角度去归类问题,看到问题的共性

2.6.2. 让运行时有更大的余地去做智能的优化

2.6.3. 让埋头于实现细节的开发者看到原本视野之外的一些解决方案

2.6.4. 在更高的抽象层次上做事情,运行时才好去优化低层次的细节

2.7. Clojure

2.7.1. 抹去了并发的麻烦

2.7.2. Lisp灵活的语法

2.7.2.1. 什么时候可读性变差了,我们就调整语法去满足可读性

3. 完美数的分类问题

3.1. 一个完美数的真约数(即除了自身以外的所有正约数)之和,恰好等于它本身

3.2. 命令式解法

3.3. 稍微向函数式靠拢的完美数分类解法

3.4. 完美数分类的Java 8实现

3.4.1. 缓求值(lazy evaluation)

3.5. 完美数分类的Functional Java实现

3.5.1. Java8之前的实现方式

3.5.2. 用匿名内部类来模拟高阶函数的编程风格

3.5.3. 高阶函数消除了摩擦

4. 基本构造单元

4.1. 筛选(filter)

4.1.1. 根据用户定义的条件来筛选列表中的条目,并由此产生一个较小的新列表

4.1.2. 将用户(通常以高阶函数的形式)给定的布尔逻辑作用于集合,返回由原集合中符合条件的元素组成的一个子集

4.1.3. Scala

4.1.3.1. filter()

4.1.3.1.1. 返回所有匹配元素的集合

4.1.3.2. partition()

4.1.3.2.1. 由原集合的内容划分而成的两个集合,原集合本身保持不变

4.1.3.3. find()

4.1.3.3.1. 只返回第一个匹配项

4.1.3.4. takeWhile()

4.1.3.4.1. 从集合头部开始,一直取到第一个不满足断言的元素

4.1.3.5. dropWhile()

4.1.3.5.1. 从集合头部开始,一直丢弃满足断言的元素,直到遇到第一个非匹配项

4.1.4. Groovy

4.1.4.1. findAll()

4.1.4.2. split()

4.1.4.3. find()

4.1.4.4. takeWhile()

4.1.4.5. dropWhile()

4.1.5. Clojure

4.1.5.1. (filter )

4.2. 映射(map)

4.2.1. 对原集合的每一个元素执行给定的函数,从而变换成一个新的集合

4.2.2. 传给映射函数的是一个高阶函数和一个集合,它在对集合中的每一个元素施用传入的函数之后,产生另一个集合作为返回值

4.2.2.1. 返回的集合大小与原来传入的集合相同,只是元素的取值变了

4.2.3. 展平(flattening)

4.2.3.1. 用来消除嵌套的库函数

4.2.4. Scala

4.2.4.1. map()

4.2.4.2. flatMap()

4.2.5. Groovy

4.2.5.1. collect()

4.2.5.1.1. it关键字作为参数占位标记

4.2.5.2. flatten()

4.2.6. Clojure

4.2.6.1. (map )

4.2.6.2. (flatten )

4.3. ***折叠(fold)/

化约(reduce)***

4.3.1. catamorphism这种范畴论的态射概念具体应用到列表操纵上面的变体

4.3.2. reduce

4.3.2.1. 一般在需要为累积量设定一个初始值的时候使用

4.3.3. fold

4.3.3.1. 起始的时候累积量是空的

4.3.4. 用累积量(accumulator)来“收集”集合元素

4.3.5. 在纯函数式语言里,左折叠和右折叠的实现并不相同

4.3.5.1. 右折叠允许操作无限长度的列表

4.3.5.2. 左折叠则不允许

4.3.6. 交换律

4.3.6.1. 加法满足交换律

4.3.6.2. 减法和除法在内不能随便调换顺序

4.3.7. Scala

4.3.7.1. reduce()

4.3.7.2. reduceLeft()

4.3.7.3. reduceRight()

4.3.7.4. 运算次序

4.3.7.5. foldLeft()

4.3.7.6. foldRight()

4.3.8. Groovy

4.3.8.1. inject()

4.3.9. Clojure

4.3.9.1. (reduce )

4.3.9.1.1. Reducers库

有关读函数式编程思维笔记02_转变思维的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  3. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  4. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  5. ruby - 在 Ruby 中按名称传递函数 - 2

    如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只

  6. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  7. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  8. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. 牛客网专项练习30天Pytnon篇第02天 - 2

    1.在Python3中,下列关于数学运算结果正确的是:(B)a=10b=3print(a//b)print(a%b)print(a/b)A.3,3,3.3333...B.3,1,3.3333...C.3.3333...,3.3333...,3D.3.3333...,1,3.3333...解析:    在Python中,//表示地板除(向下取整),%表示取余,/表示除(Python2向下取整返回3)2.如下程序Python2会打印多少个数:(D)k=1000whilek>1:    print(k)k=k/2A.1000 B.10C.11D.9解析:    按照题意每次循环K/2,直到K值小于等

随机推荐