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

函数式编程,真香 最开始接触函数式编程的时候是在小米工作的时候,那个时候看老大以前写的代码各种 compose,然后一些 ramda 的一些工具函数,看着很吃力,然后极力吐槽函数式编程,现在回想起来,那个时候的自己真的是见识短浅,只想说,'真香'。 最近在研究函数式编程,真的是在学习的过程中感觉自己的思维提升了很多,抽象能力大大的提高了,让我深深的感受到了函数式编程的魅力。所以我打算后面用 5 到 8 篇的篇... 阅读详情

 

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库

Kotlin 函数式编程(Kotlin Functional Programming) Kotlin函数式编程 (KotlinFunctionalProgramming) 陈光剑 1.函数式概述6 1.1.函数式简史6 1.2.函数式编程语言家族7 1.2.1.概述7 1.2.2.函数式编程语言介绍8 1.3.函数式编程的特征10 1.3.1.函数是"第一等公民"(First-classandhigher-order... 阅读详情

相关推荐

MATLAB控制信号发生器(USB-GPIB-HS)GPIB仪器控制教程(含matlab代码)

自动化测试时需要自动产生信号,通过matlab控制信号发生器的频率与功率,以实现自动化信号生成输出

qq_43686057的博客 1606

读书笔记-函数式编程思维

学习笔记-函数式编程思维函数式编程思维主要内容演化的语言现实应用多语言与多范式 读书《函数式编程思维》(Neal Ford 著) 目前理解的函数式编程思维,是一种抽象的映射关系,输入和输出之间的映射。应用这样的抽象,让我们不用关注于低层次细节的实现。最直观的感受就是Java8中的lambda也太好用了啊~ 函数式编程思维 主要内容 演化的语言 现实应用 多语言与多范式 主要内容 范式转变 ...

博学之,审问之,慎思之,明辨之,笃行之 454

借助OSS搭建在线教育视频课程分享网站-阿里云的课程体验和记录

阿里云的《搭建在线教育网站》免费课程里面讲的啥,我点进去看了看

LegendNoTitle的博客 3023

通过Go示例理解函数式编程思维

一个孩子要尝试10次、20次才肯接受一种新的食物,我们接受一种新的范式,大概不会比这个简单。-- 郭晓刚 《函数式编程思维》译者函数式编程(Functional Programming, 简称fp)是一种编程范式,与命令式编程(Imperative Programming)、面向对象编程(OOP)、泛型编程(Generics Programming)、逻辑编程(logic Programming)...

TonyBai 1135

嵌入式开发避坑指南:用DWT做延时函数,这几个细节不注意代码会跑飞

本文深入探讨了在Cortex-M嵌入式开发中使用DWT实现精确延时函数的关键技巧与常见陷阱。针对DWT_CYCCNT计数器应用中的内核兼容性、溢出处理、编译器优化等五大核心问题,提供了工业级稳健解决方案,帮助开发者避免代码跑飞风险,实现微秒级高精度延时控制。

weixin_42653691的博客 160

叶绿体基因组提交NCBI全流程避坑指南

叶绿体基因组作为环状细胞器DNA,其数据提交并非简单上传,而是需严格遵循INSDC标准的学术出版行为。其核心原理在于元数据完整性、拓扑结构语义一致性与分类学路径精确匹配;技术价值体现在保障序列可追溯、可复现、可互操作;典型应用场景涵盖植物系统发育、条形码开发及合成生物学底盘构建。实践中,FASTA头行格式、feature table嵌套规则、taxid绑定及BankIt静默校验等环节极易引发失败。本文聚焦NCBI|叶绿体基因组数据上传中的高频报错与隐性约束,提供面向生物信息工程师的实操级规范解析。

weixin_31960565的博客 328

说说什么是函数式编程思维

假设来到阿里巴巴面试,面试官可能就会让你把反转下二叉树镜像。请大家先思考下,怎么实现? (1)命令式编程思维 一种实现方式是这样的: Node invertTree(root){ if (root is null){ return null; } root.left = invertTree(root.right); root.right = invertTree(root.left); return root; } 我们首先判断节点是否为空,如果为空则直接抛出;然后翻转右

读万卷书,行万里路 987

StarRocks FE启动异常

服务器断电,StarRocks FE 启动失败。

qq_15138049的博客 1113

函数式编程思维

1.纯函数 对于相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用,也不依赖外部环境的状态。 var xs = [1,2,3,4]; //Array.slice是纯函数,因为它没有副作用,对于固定的输入,输出总是固定的 xs.slice(0,2); xs.splice(0,2); //会改变源数据,非纯函数 优缺点: import _ from 'loadsh'; var sin = _.memorize(x => Math.sin(x)); //第一次计算

Two_Too的专栏 1564

PCB板设置20H 原则理解

20H原则是PCB设计中抑制EMI辐射的关键方法,要求电源层比相邻地层内缩20倍介质厚度(20H)。在四层板中实现20H原则需采用S-G-P-S层叠结构,确保GND与PWR紧邻。具体步骤包括:确定GND-PWR间介质厚度H,计算20H值(通常80-120mil),并在设计软件中将电源层四周内缩20H,同时保持地层完整不内缩。注意避免常见误区,如混淆介质厚度、地层内缩等。该原则能有效限制边缘场辐射,降低EMI干扰,是四层板EMC设计的重要规范。

qq_37999850的博客 694

【AlphaFold2】深入浅出,讲解Evoformer|学习笔记

本篇博客是围绕youtube德国博主Kilian Mandon()的《从头实现AlphaFold2:AlphaFold Decoded》的第五期视频讲解和note-book内容写成的笔记,加上了自己的理解和对相关概念的解释。上期我们讲解了AlphaFold2的特征提前的部分【AlphaFold2】Feature extraction:提取特征,为模型输入做准备|Datapipeline讲解。本期,我们将介绍AlphaFold2中最为庞大且最为重要的部分——Evoformer。

Yaoyao2024的博客 2016

函数式编程

Functional Programming 什么是函数式编程 函数式编程的思维方式:把显示世界的事务和事物之间的联系抽象到程序世界(对运算过程进行抽象) 函数式编程中的函数指的数学中的函数即映射关系,输入的值对应一个输出的值,例如 y = f(x) 相同的输入始终得到相同的输出(纯函数) 函数式编程用来描述数据(函数)之间的映射 // 非函数式 const num1 = 2 const num2 = 3 const sum = num1 + num2 console.log(sum) // 函数式

qq_38916811的博客 6902

PNP NPN线性接近开关接线嵌入式:详细指南与示例代码

在嵌入式系统中,PNP和NPN线性接近开关是常用的传感器类型,用于检测物体的接近或离开。在嵌入式系统中,PNP和NPN线制接近开关是常用的传感器类型,用于检测物体的接近或离开。本文提供了有关PNP和NPN线性接近开关接线的详细指南,并提供了一个简单的示例代码,以帮助您在嵌入式系统中正确使用这些传感器PNP NPN 线制接近开关接线 嵌入式:详细指南与示例代码。与PNP开关不同的是,NPN线性接近开关的正极连接至系统的正极电源。与PNP开关不同的是,NPN线制接近开关的正极连接至系统的正极电源。

CyberSphinx的博客 1272

你真的理解函数式编程吗?

大数据以及人工智能越来越流程,你是否可以轻松适应大数据编程,函数式编程在其中起着重要作用,如何从面向对象编程跳槽到函数式编程?你是否觉得函数式各种概念难于理解?本场 Chat 将为你解答。我将为你分享亲身学习和理解关于函数式编程的经验: 高阶函数、闭包、匿名函数等 高阶函数和闭包是啥关系? 柯里化 函数式编程思维 适合人群: 如果你想转人工智能领域,请关注此 Chat 如果你想了解机器学习,...

GitChat 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

读函数式编程思维笔记01_演化的语言

第一种面向对象的语言Simula 67是1967年发明的,可是直到1983年诞生的C++终于流行起来以后,面向对象才真正成为主流。早年Java总被认为太慢,内存耗费太高,不适合高性能的应用,如今硬件市场的变迁把它变成了极具吸引力的选择。第四代编程语言4GL下的一行命令,3GL可能要用很多行才写得出来,因为4GL自带了更丰富的编程环境。把时间花在更高层次的抽象上,多考虑怎样解决复杂的业务场景,少去费心复杂的底层运作。要想契合问题域的表达习惯,可以利用运算符重载来改变语言的外貌,不必创造全新的语言。

lyingSeven的博客 158

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

函数式编程思维读后总结与感想

语言设计者可以无视他们给语言定的规矩,拥有的优化手段和空间是“凡人”无法企及的,大部分情况下他们设计的东西更加高效,但是君不见蓬勃发展的第三方库,语言自身不断版本迭代更新、兼容并蓄取百家之长,以及那些。语言设计者可以无视他们给语言定的规矩,开发者无法触碰的底层设施,不过是语言设计者手中的玩物,他们拥有的优化手段和空间是“凡人”无法企及的。放弃对繁琐细节的掌控,关注问题域,而非关注问题域的实现在,这是交出控制权的观点。尽信书,不如无书,不过,还是要多读书,多思考,多方位,多角度相互印证。

lyingSeven的博客 183

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[Java 8] (1) 函数式编程简介

思维方式的转变 以从一个城市集合中寻找是否存在Chicago为例: 习惯的方式 boolean found = false; for(String city : cities) { if(city.equals("Chicago")) { found = true; break; } } System.out.println("Fo

不忘初心,好好沉淀 1万+

Swift函数式编程——函数

函数式编程的核心是函数,函数是“头等公民”。这就像面向对象语言的主要抽象方法是类。Swift中的函数具有函数式语言中的函数的所有特点。这种支持使得你可以很容易地使用Swift写出函数式风格的代码。

Jum的博客 1508

函数式编程:挑战传统的编程思维

1.背景介绍 函数式编程(Functional Programming)是一种以函数为主要构建块的编程范式。它来自数学领域的函数概念,强调函数的引用透明性、无副作用、高度模块化和组合性。函数式编程语言包括 Lisp、Haskell、Scala、Clojure、Erlang等。 传统的编程范式如面向对象编程(Object-Oriented Programming, OOP)和过程式编程主要基于变...

AI天才研究院 1025

Java函数式编程

Java函数式编程 初探函数式编程【JavaScript篇】哔哩哔哩bilibili 三更草堂Up主。不会Lambda表达式、函数式编程?你确定能看懂公司代码?-java8函数式编程(Lambda表达式,Optional,Stream流)从入门到精通-最通俗易懂_哔哩哔哩_bilibili 项目地址:bearbrick0/FuncProgram: 👀Java函数式编程的demo (github.com) 什么是函数式编程 为什么要学习函数式编程

- 7129

《JavaScript函数式编程思想》——从面向对象到函数式编程

第9章  从面向对象到函数式编程 假如本书的写作时间倒退回十年前,书名可能会变成JavaScript面向对象编程思想。自上世纪90年代兴起的面向对象编程思想随Java的繁荣达于顶点,在JavaScript从一门只被用来编写零星的简单的表单验证代码的玩具语言变成日益流行的Web应用不可取代的开发语言的过程中,脚本的作者们也逐渐学习和习惯了被视为软件开发正统的面向对象编程。等到盛极而衰,面向对象编程...

JavaScript 3360

命令式编程和函数式编程的区别

The difference between imperative and functional programming 命令式编程和函数式编程的区别 第一次尝试翻译外国的技术文章,很担心自己的语言不够准确。尝试尝试,总要迈出这一步的!   你是否有过这样的沮丧经历?我要开车去一个我从来没去过的地方,于是我网上查看关于这个地方的信息。浏览网页,想找到地址和邮编。不过,我却找到了这样的东

lushl9301的专栏 6227

读函数式编程思维笔记05_现实应用

增加函数式特性,还增加了一些配合使用的语法糖衣

lyingSeven的博客 134

《函数式编程思维》的图表注记

 对于计算机语言的学习,自己还处在入门阶段,在图书馆无意翻开一本《函数式编程思维》的书。单从书名就感觉抽象,翻开一看好多陌生的专业词汇,读起来真是挺费劲的。但是总感觉说的挺有道理,虽然不知道对不对。。。因此想记下书中的图表标注(不是书的精华,请作者原谅本人无知),好以后等自己知识丰富了来验证。 编程范式(Programming Paradigm)是某种编程语言典型的编程风格或者说是编程方式

葱爆牛肉的博客 429
上一篇: 读函数式编程思维笔记01_演化的语言
下一篇: 读函数式编程思维笔记03_权责让渡
躺柒
博客等级 码龄4年 7004粉丝 1321原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值