首页 > 编程语言 >读函数式编程思维笔记02_转变思维

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

时间:2023-01-21 07:22:05浏览次数:49  
标签:02 思维 4.1 函数 4.3 4.2 编程 3.5 集合

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,思维,4.1,函数,4.3,4.2,编程,3.5,集合
From: https://www.cnblogs.com/lying7/p/17063488.html

相关文章

  • 最新中国游戏公司收入排行榜 2022 All In One
    最新中国游戏公司收入排行榜2022AllInOne2022中国手游收入排行榜2022全球手游收入排行榜腾讯不出意外地高居榜首。排名第一的《王者荣耀》跟排名第二的《和平......
  • 2023 hgame趣题——1
    hgame2023week2Transfer借hgame开始入门学习自己一直想接触的Blockchain方向,在四周的比赛时间内会记录hgame中有趣的问题,Crypto方向等a掉四周的题目一起放出来源代码:......
  • x210-2023-01-20
    1、三星S5PV210手册GPJ0CON寄存器是4bit对应一个pin脚的,所以GPJ0CON[7]~GPJ0CON[0]刚好平分32bit,但这里不是要说的重点,而是GPJ0DAT[7:0],因为到了19-ARM硬件接口GPIO4,如果......
  • 2023-01-20 早上被叫醒的是老家“情报中心”的开会声
    2023-01-20周五今天早上被叫醒的不是梦想,是老家经典的“情报中心”开会声,是早早出来售卖各种用来“念心”的肉丸子的叫卖声,我猜明天叫醒我的就应该是潮汕地区特别经典的......
  • 2023-01-16 下高铁一堆人热情迎接 找培民
    2023-01-16周一16号坐高铁回家,下站后外面一片人,都是开小汽车三轮车和摩托车的司机。在拉客,嘴里喊着隆江惠来溪西有无。因为我知道外面有班车能到达我要去的地方所以我......
  • 2023-01-18 隆江猪脚饭
    2023-01-18周三关于隆江猪脚饭,隆江本地哪家猪脚饭最正宗,这个问题一直被讨论着。网络上各种网红来隆江打开隆江猪脚饭的时候,无疑是“猪脚兴饭店”这家店。有人说很好吃......
  • 2023牛客寒假算法基础集训营3
    题目链接:https://ac.nowcoder.com/acm/contest/46811#question牛客题目讲解:https://www.bilibili.com/video/BV13D4y1p7Sg/?spm_id_from=333.999.0.0&vd_source=affdde9b0......
  • D 宿命之间的对决【2023牛客寒假算法基础集训营3】
    D 宿命之间的对决原题链接题意现在给定一个正整数n,小红和小紫轮流操作,每次取n的一个因子x,使得n减去x。谁先将n减到0谁输。小红先手操作,她想知道在双方足够聪明的情况......
  • CU002HModel matching query does not exist.
    问题描述:CU002HModelmatchingquerydoesnotexist.问题分析:匹配的查询不存在。顾名思义就是什么数据都没有。原因是get查询时没有结果会报错,所以有两个选择,添加使用tr......
  • 2022年终总结
    迟来的年终总结,最近搬家太忙,所以一直处于鸽鸽鸽的状态。1、关于职业1.1、是否回归老本行?关于职业,我真的太迷茫,太迷茫了,今年原本在某医院信息科外包工作的,那个时候还没这......