当前位置:首页 » 编程软件 » 半函数式编程

半函数式编程

发布时间: 2022-07-17 08:37:20

‘壹’ 什么是函数式编程思维

回答都有跑题,show概念之嫌,题主问的是函数式思维,这个问题我一直在思考,毕竟是方法论,能力有限,只能从切身实践告诉你
1.表达式化

最初的时候,需要转变观念,去可变量,去循环,把命令式改成表达式,注意,这只是把你丢在荒山野岭让你感受一下,离开熟悉的环境,地球依然在转,但是有个
重点,那就是一切都是表达式; 为什么是表达式呢?这个问题就像为什么鱼在水里?
因为函数式建立在lambda演算之上而非图灵机,只不过两者被证明等价,所以你可以在你的机器上跑全是表达式的代码,就如有人证明天空适合鱼生存,所以
鱼可以在天上游
当你接受了鱼可以在天上游之后,就该上正餐了

1.5 数据与行为分离
这也是和面向对象不一致的地方,面向对象强调数据与行为绑定,但函数式不是,确切的说函数式 函数与数据等价,所以你才可以将函数当参数与返回值,你在设计时,切勿让数据自己长腿能跑,其次,行为必须消除副作用,不可以偷偷把数据改了,习惯第一条后,应该不会的

2.高阶逻辑

了函数式,就不要在想循环,赋值这些低阶逻辑了,而应该更高阶的思考问题,这比转化表达式更难,函数式又叫声明式,也就是你要做什么,只要说一下就行,而
非写个遍历,做个状态判断,用函数式你不需要考虑这些,你不知道函数式的列表是怎么遍历的,中间向两边?
从后往前?这也是为何函数式适合并发的原因之一,你想知道列表中大于3的数有多少,只要,list.count(_ > 3)
而不是写循环,你可以直接写你的业务,不要拘泥于细节,有点像sql, 你需要什么告诉电脑就行,你或许会问,count foreach filter
这些函数怎么来的? 因为有了他们你才不需要写循环,他们把你留在高阶逻辑中,这个问题的答案请看下面

3.组合子逻辑 或又叫 自底向上的设计

数式和OO是反的,面向对象是自顶向下的设计,函数式是自底向上的设计,也就是先定义最基本的操作,然后不断组合,不断堆积以满足你的所有需要,如sql
定义了select, from, where...这几个组合子,来满足你的查询需求,同理函数式语言会提供foreach,
map等组合子(操作)来满足你的需求,所以你必须自下而上的设计你的代码结构,并且满足你的需求,当你只用组合子写代码时,你会发现你写的全是高阶逻辑

果这些已有组合子满足不了你,你就得自己写,foreach不行,你就自己写递归,我告诉你,递归背后也是组合子,这里一些'大神'应该不知道,在图灵机
里,递归就是方法不断调用自己没什么好说的,但是在lambda演算中,匿名函数是没法调用自己的,所以递归是用Y组合子(又叫不动点组合子)把递归函数
自己求解出来再调用的,这才可以实现递归,并与图灵机的循环等价,有点跑题了,总之要想顺手的写函数式,最好用面向组合子的设计,注意,不是必须,组合子
演算和lambda演算可以相互转化,也就是,你完全可以写一堆杂乱的表达式,但没有组合子逻辑来得清爽,Haskell大规模使用monad这个特殊组
合子,始其变得统一整洁

好了,总结一下
函数式思维,其实就是组合子逻辑,用简单的几个函数组合来构建复杂逻辑,始终以高阶的角度去表达问题,而非依赖副作用。
知道这点,你用java也可以写函数式代码了

但是,这也只是本人积累得来的感悟,绝不敢大肆伸张这就是函数式,我也在不断研究中,如有问题,还望大神指正

‘贰’ 在python常说的函数式编程是什么意思

函数式编程相对应的是命令式编程

比方说你要定义一个方法

命令式编程如下:

deffunc1():
<expression()>

而同样功能的函数式编程如下:

func1=lambda:<expression()>

‘叁’ 函数式编程的特点

其实函数式编程的话你也要学计算机就会知道。

‘肆’ 什么是函数式编程

在维基网络中,已经对函数式编程有了很详细的介绍。
那我们就来摘取一下Wiki上对Functional Programming的定义:
In
computer science, functional programming is a programming paradigm that
treats computation as the evaluation of mathematical functions and
avoids state and mutable data.
简单地翻译一下,也就是说函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念。

‘伍’ 求科普什么是函数式编程语言

实际上,函数式编程没有一个严格的官方定义。严格上来讲,函数式编程中的“函数”,并不是指我们编程语言中的“函数”概念,而是指数学“函数”或者“表达式”(例如:y=f(x))。不过,在编程实现的时候,对于数学“函数”或“表达式”,我们一般习惯性地将它们设计成函数。所以,如果不深究的话,函数式编程中的“函数”也可以理解为编程语言中的“函数”。

‘陆’ 式编程,命令式编程()和函数式编程的区别

编程语言主要有四种类型

  • 声明式编程:专注于”做什么”而不是”如何去做”。在更高层面写代码,更关心的是目标,而不是底层算法实现的过程。
    ex: css, 正则表达式,sql 语句,html, xml…

  • 命令式编程(过程式编程) : 专注于”如何去做”,这样不管”做什么”,都会按照你的命令去做。解决某一问题的具体算法实现。

  • 函数式编程:把运算过程尽量写成一系列嵌套的函数调用。
    函数式编程强调没有”副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
    所谓”副作用”(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

‘柒’ 函数式编程有什么弊端

我接触过Haskell、Clojure和其他语言,也做过PL的“研究”。可以浅谈一下:

  • 函数的复杂度

分析Haskell程序的时间和空间复杂度是很麻烦的。首先编写Haskell程序往往是很多“重用”内置/自定义数据结构,以实现数据持久性(或“不变性”)可以增加空间和时间消耗(实现策略有很多,但采取临时解决方案不影响永久治愈),优点是控制副作用。然后,函数组合和高阶函数可能代价昂贵,可以生成额外的中间数据。其优点是抽象能力强,模块化是有益的。最后,惰性评价使过程评价模型复杂,滥用可导致效率的降低。功能语言的分析工具也较少。

但是这些提供了细粒度的模块化,程序员需要更多的“设计”。“使用函数式编程的程序员必须努力确保程序使用更小、更简单、更通用的模块,”Huges说。这是一个挑战。

而且,模块之间的交互也是一个问题。

‘捌’ 为什么这两年函数式编程又火起来了呢

函数式编程的好处
由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好处主要是不可变性带来的。没有可变的状态,函数就是引用透明(Referential transparency)的和没有副作用(No Side Effect)。

一个好处是,函数即不依赖外部的状态也不修改外部的状态,函数调用的结果不依赖调用的时间和位置,这样写的代码容易进行推理,不容易出错。这使得单元测试和调试都更容易。

不变性带来的另一个好处是:由于(多个线程之间)不共享状态,不会造成资源争用(Race condition),也就不需要用锁来保护可变状态,也就不会出现死锁,这样可以更好地并发起来,尤其是在对称多处理器(SMP)架构下能够更好地利用多个处理器(核)提供的并行处理能力。

3.cpu的性能提升将体现在核数增加,这样并行的程序运行速度会越来越快。并行的程序的写法就是找出不能并行的地方,其他地方都尽量并行。

如果要这样写,最需要避免的事情就是赋值。函数式编程的本质就是,规避掉“赋值”

‘玖’ 到底什么是函数式编程,能做什么,是不是会崛

首先,比较被公认接受的,对于具体的语言来说,是指有一个“一等函数”(first class function)。不过函数这个概念本身就比较混乱。只能具体举例。比如,C++的函数就不是一等的,因为对象类型的值能被传参能被返回,函数类型的值就不行(会退化为函数指针)。换句话说C++的内建的“函数”是阉割的。这类函数式语言一开始以Lisp为代表,基本的理论基础是λ演算。

其次,关于表达式和语句。语句一开始就是Fortran的语法。这种设计其实没有必要,因为脱离更基本的表达式语法,也没法表示计算。Lisp就没有在语法上特意区分出语句。函数式语言的语法设计习惯上不使用语句,因为具有一等函数的表达式的表达能力通常已经足够强。C这样的语言的“语句”除了表达确定的求值顺序外,也就是一种无谓地指令式风格的习惯罢了。

第三,关于存储可变状态。修改状态(典型地,赋值)的程序是指令式范式的。函数式的范式通常避免无谓地修改状态。
极端的情况是语义规则不提供修改状态的接口,如Haskell以及C++的模板元编程,这样的风格称为所谓的“纯函数式”。
纯函数式的“函数”不具有修改值这类副作用(对于C/C++来说,读volatile对象也是副作用),所以对于确定的输入可以保证有确定的输出,且求值时函数调用可以以任意次序被整个替换——非纯函数式因为副作用顺序的不同会导致程序行为的不同。这种性质被称为引用透明性(referential transparency)。
但是注意,纯函数式并不是实现引用透明的必要条件,保证内部状态的修改不影响参数和返回值的关联同样能做到。考虑到和通用需求的差异造成的困难,对于自律的用户来说,纯函数式其实没什么必要,到头来只是一种限制而已。

‘拾’ Scala的implicit如何使用需要注意什么

习函数式编程
阅读DDD巨着《Patterns, Principles, and Practices of Domain-Driven Design》程Scott第5章提使用函数式编程语言配合贫血模型实践DDD种思路激发我限遐想
软件发领域我已经拥许抽象论量实现技术我认切归根结底都类思维软件发领域具体表达式类认识析软件所要解决业务领域问题思考内容外乎由两部组:‘业务流程’与‘业务规则’前者答业务先做做问题;者则答遇情况应该做问题两者结合我需要业务结或者叫作实现业务目标
再想想目前习掌握面向象系列何述思维结映射软件呢我认:
于业务流程我其表达若干象间合作比UML序列图象与消息进具化具体类及其职责比类及其若干业务
于业务规则我其表达若干判断逻辑比UML流程图判断支进具化业务if-else语句或者再复杂点表达工厂、策略等设计模式实际运用
我认于复杂业务规则梳理象数归纳进行演绎:假设函数y=f(x)给定x定义域确定y值域特别排列组合等面些问题经采用递归式解决所角度讲函数式编程更贴近类思维习惯所让我自目光转向
选择Scala
选择具体函数式编程语言我首先想同能支持面向象编程即便LISP作函数式编程语言先祖诞已达半世纪单纯函数式编程语言与面向象编程语言相比抽象领域概念、组合系统模块、实现信息隐蔽等面存定差距所直没软件发主流
信息隐蔽原理:西安电科蔡希尧与陈平师于1993合作版《面向象技术》书描述:需求求解离;相关信息——数据结构算集模块其模块隔离能随便访问模块内部信息
其由于我语言路线Pascal → C → C++ → C#所我希望能选择种风格近似于C、强类型函数式编程语言比较F#、R、ErLang等几种见函数式编程语言我终选择Scala
Scala何优势
注:内容节选翻译或参考自《Programming in Scala》第1章、第3章《Programming Scala》第6章算完整意义
函数式编程优势
纯函数没副作用论何何于函数y=f(x)给定x必定y产二义结论于代码测试并发由于给定输入必定预期输受其素干扰所能效减少Bug产
函数式编程量使用immutable值意味着函数运算结总创建新实例避免通并发环境防止数据共享冲突采取保护机制尽管需要额外Copy操作Scala针性提供高效Copy实现及延迟计算等弥补机制
函数等公民函数作表达式部借由函数间嵌套、组合实现复杂判断逻辑
Scala语言本身优势
Scala面向象与函数式编程混合语言所能效结合二者优点
Scala属于Java态圈JVM平台与Java起编译运行所许Java框架、工具都直接应用于Scala语言编写项目
Scala视切数据类型皆象且支持闭包、lambda、by-name参数等特性语简洁明快
Scala使用Actor作并发模型与Akka框架自契合种区别于传统、基于数据共享、锁主要机制并发模型其特点于Actor基本单位、没数据共享、基于消息传递实现Actor间协作效避免死锁、减少竞争
朝要转向数据领域Spark型框架作支撑知乎:与 Hadoop 比何看待 Spark 技术
Scala实践DDD何意义
说我根本目要Scala作实现DDD主要武器试想Scala我实现DDD程能哪些帮助呢我暂且胡侃乱诌:
表示值象、领域事件等元素更直观值象、领域事件DDD都应该immutable往采取POCO形式表示现改用Scalaval及case class表示语层面直观表明修改
类层面实现CQRS语支持用ScalaFunction(返类型非Unit)应CQRSQuery保证类没副作用;用Procere(返类型Unit)应CQRSCommand明确表明类产修改状态等副作用同语层面能二者进行明确区
模式匹配丰富函数操作除则表达式Scala形式模式匹配语提取数据、完数据组聚合等运算、实现逻辑判断提供强支持比定义def sum_count(ints:Seq[Int) = (ints.sum, ints.size)函数我调用1至6整数序列整数值合计及该序列尺寸:val(sum, count) = sum_count(List(1, 2, 3, 4, 5, 6))
实现DSL提供力支持Scala自带解析框架加灵函数语支持要自实现套DSL及其相应语解析器再困难比配置文件条配置语句表示退休条件龄达60周岁或者工龄届满30:retire = (Age >= 60) || (ServiceLength >= 30)往式自写语解析器条文本转换相应Specification象扔给聚合使用现Scala帮助使编写语解析器环节工作量减少
合理高阶函数设计使规则编写简化比打折规则、费用报销规则往能需要若干层if-else嵌套现则通高阶函数幅简化我强烈推荐刘光聪先视频Refactoring to Functions刘先重构程发现高阶函数强
Actor高效并发打基础Actor
内部完全自治自带用于存储消息mailbox与其Actor能通消息进行交互每Actor都并发基本单位些特点非适合于
采取Event
Sourcing式实现DDD每聚合都比Actor聚合内部始终保持数据强致性聚合间交互领域事件则比Actor间
消息聚合间借由领域事件Saga保证数据终致性
TraitAOP利器TraitScala另特色象AOP织入能态给某类型注入或者结构比配合类Circuitwith面4Trait定义val circuit = new Circuit with Adders with Multiplexers with Flipflops with MultiCoreProcessors创建带加器、乘器、触发器核处理器元件
隐式实现类型扩展提供支持应C#静态扩展Scala通implicit实现数据类型扩展提供便捷Trait外另功能扩展手段
能降低见BDD框架习本尽管点能比较牵强我努力摸索何BDD与DDD结合见Cucumber、Spock等些BDD框架其语与Scala比较相近所我才说
哪些Scala习资料
我目前主要习资料并衷欢迎各位留言补充
书籍
Programming in Scala:由Scala语言设计师Martin Odersky编写循序渐进配合量实例入门必读吧
Programming Scala:视角与面本点没Scala语言基础觉困难适合掌握基本语温故知新
线文档与视频
Scala 官文档:Scala官网作寻找资料发点错
Scala 课堂:文版Scala基本语线课堂
Scala Synatax Primer:由Jim McBeath整理Scala语概要字典用
The Neophyte’s Guide to Scala:名Scala入门指南Scala提取器Extractor作实例始
Scala 初指南:面本指南译本
Effective Scala:文版Scala高效编程
SBT文入门指南:Scala Build Tool
社区
Scala 文社区:算跃原懂
Scala User:Scala入门者聚集没Stack Overflow严格需要点爬墙身手
SDK及IDE
Java SE:先装
Scala SDK:再装
SBT:装
IntelliJ IDEA:装能比较便始Scala编程


近读书杂DDD、BDD、Scala、Cucumber及Java基础等等都涉及真恨口吃胖由于间精力限所
现知识消化问题迟迟没进入致用环节能先纸谈兵歹先自习程些思考、看东西先记载备

热点内容
bin存储 发布:2025-02-07 20:00:50 浏览:202
android加载界面 发布:2025-02-07 19:55:28 浏览:870
好矿云服务器 发布:2025-02-07 19:54:31 浏览:948
java电话簿 发布:2025-02-07 19:49:26 浏览:796
超级脚本制作 发布:2025-02-07 19:31:30 浏览:486
怎么查看支付宝的账号密码 发布:2025-02-07 19:26:48 浏览:16
惠普服务器查看ip指令 发布:2025-02-07 19:26:47 浏览:434
算法设计模式 发布:2025-02-07 19:15:52 浏览:746
服务器1u能连接几台电脑 发布:2025-02-07 18:50:02 浏览:154
立人编译 发布:2025-02-07 18:48:32 浏览:766