首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scala 最佳实践:纯函数

下面是 Scala 一个函数,它接收两个值并返回它们和: scala> def add(a:Int, b:Int) = a + b add: (a: Int, b: Int)Int 这个函数没有任何副作用...出于优化角度,可以对使用纯函数表达式调用顺序进行重新安排,这样所产生结果与之前是完全相同。...为什么使用纯函数 函数式编程一个主要原则就是写出核心为纯函数应用,这样一来,那么副作用就会只存在于占比不多外层结构。...纯函数好处有: 易推断 这是因为一个纯函数,它没有任何副作用,也没有隐藏 I/O 信息,仅通过查看它签名就能知道这个函数是干什么。...延迟处理 延迟求值(Lazy evaluation)指的是只有当需要一个表达式值时,才会该表达式进行求值。如果在程序执行过程中,这个值从来没有被用到,那么可能就根本不会对该表达式求值。

62910

Scala编程规范与最佳实践

或 specs2 使用SBT来构建项目 编码时 打开一个ScalaREPL控制台,随时测试验证想法 纯函数-没有副作用代码段 引用透明性:同样输入参数,总是返回同样结果!...表达式没有依赖应用某个 状态|值|IO,只依赖输入参数和计算算法 无副作用:函数不应该带来对应用某个 状态|值 mutable 不会对输入参数进行 改变 mutable 不执行IO操作或者和用户进行交互...相对statement编程是不返回数据,使用副作用!...scalaif/else match/case try/catch 都有返回值 优点:更易理解代码;没副作用,更容易测试 与scala语法绑定;更适合多核计算机 使用match/case...switch/case 模式匹配中 case class 部分函数中 忘记java中null概念禁止使用null 变量初始化用Option 参数使用Option 没有获取预期结果时

1.3K50
您找到你想要的搜索结果了吗?
是的
没有找到

Scala如何改变了我编程风格:从命令式到函数式

尽管在C++里面这种编程风格是有可能,但在我使用C++日子里,我却没有考虑用这种方式进行多重继承,而我在C++设计中也不怎么使用抽象基类。...一句话:我学会了欣赏函数化风格。函数化编程风格强调不可变对象、变量可被初始化但不能重新赋值( Java 中最终变量)、数据结构转换,以及方法和控制构造,最终产生一个没有副作用结果。...这个领域另一端是命令式风格,以可变对象、变量可被重新赋值( Java 里正常变量)、在数据结构中索引、以及带副作用方法和控制构造为特征。...此外, nameHasUpperCase 这个变量被初始化了,但仅限于这一小块代码里,而没有被重新赋值。如果该变量为最终值的话,它函数化就会更为清晰。...Scala 允许我方便应用函数式和命令式风格,结合使用此二者,我就能找到写出清晰代码最佳方式。 函数式编程和命令式编程简介 什么是函数式编程?

1.1K30

Scala专题系列(九) : Scala函数式编程

什么是函数式编程 函数式编程是指只用纯函数来构造程序, 函数是没有副作用 先说一下什么是副作用: 普通一个函数是输入一个参数输出一个返回值,而带有副作用函数不仅仅返回一个值,还带有其它操作: 比如...总而言之,一个函数在程序执行过程中除了根据输入参数给出运算结果之外没有其他影响,就可以说是没有副作用....,,下面来举几个例子: 我们将其组合在一起,用它来对一个整数列表进行遍历,过滤出其中偶数,对每个偶数乘以 2, 再使用 reduce 函数将各个整数乘在一起: (1 to 10) filter (_...我们只用了一行代码,没有用可变计数器,也没有用可变变量作为累乘结果,就“循环”遍历了列表得出结果。...在它定义中,可能有也可能没有引用外部绑定变量。 闭包 是一个函数,可能匿名或具有名称,在定义中包含了自由变量,函数中包含了环境信 息,以绑定其引用自由变量。

37210

Scala基础概念

无缝Java互操作 构建于Jvm之上,Java包可以在Scala使用,huo1Scala写好程序给Java调用 编程思路灵活 既可以面向对象思想,也可以函数式编程思想 Scala之父:Martin...纯函数,没有副作用函数 没有副作用:状态变化 例如:调用 def Add(y:Int) = x + y 其结果为xy之和,并且调用之后没有引起x值变换,没有副作用 所以,Add函数没有副作用...,即函数中可以定义函数,有变量地方都可以使用函数,都是等同 高阶函数 函数作为一个函数输入或另一个函数输出 闭包 closure 表达式求值 函数式编程中,一切都是表达式表达式求值策略...调优递归:尾递归 函数式编程优点 Lisp是第一种函数式编程语言 编程代码量少 当构造完含数之后,对于相同输入,输出相同,便于调试 非常适用于并行编程,没有副作用,具备引用透明性,在n个节点运算结果是相同...call by value 对函数实参求值,仅求一次,求得值直接替换函数中形式参数 call by value 不会对函数实参进行表达式求值,直接把表达式传入函数体内,替换表达式形参,然后在函数内每次使用到此形参时会被求值

71930

《Java8实战》笔记(14):函数式编程技巧

因此,将所有你愿意接收作为参数函数可能带来副作用以文档方式记录下来是一个不错设计原则,最理想情况下你接收函数参数应该没有任何副作用! ...,没有采用if-then-else这种方式,目的是希望强调一个思想,那就是该函数体仅包含一条语句,没有任何副作用。...假设数据类型Expr代表是某种数学表达式,在Scala程序设计语言中(我们采用Scala原因是它语法与Java非常接近),你可以利用下面的这段代码解析表达式:  def simplifyExpression...Java中伪模式匹配  首先,让我们看看Scala模式匹配特性提供匹配表达式有多么丰富。...另一方面,如果不使用缓存这样技巧,如果你以函数式方式进行程序设计,那就完全不必担心你方法是否使用了正确同步方式,因为你清楚知道它没有任何共享可变状态。

60220

纯函数与领域模型

逸言 | 逸派胡言 本文是函数式编程思想与领域建模第二部分,重点讲解无副作用纯函数与领域模型之间关系。 纯函数 在函数范式中,往往使用纯函数(pure function)来表现领域行为。...所谓“纯函数”,就是指没有副作用(side effects)函数。...《Scala函数式编程》认为常见副作用包括: 修改一个变量 直接修改数据结构 设置一个对象成员 抛出一个异常或以一个错误终止 打印到终端或读取用户输入 读取或写入一个文件 在屏幕上绘画 例如,读取花名册文件对内容进行解析获得收件人电子邮件列表函数为...我们可以简单将一个Monad理解为提供bind功能容器。在Scala语言中,bind功能就是flatMap函数。可以简单将flatMap函数理解为是map与flattern组合。...,分别从ns和os中取值,然后利用yield生成器将计算得到积返回为一个列表;实质上,这段代码与使用flatMap和map代码完全相同。

1.1K10

理解Scala函数式风格:从var到val转变

然而在Scala看来,val和var只不过是你工具箱里两种不同工具。它们都很有用,没有一个天生是魔鬼。Scala鼓励你学习val,但也不会责怪你对给定工作选择最有效工具。...("\n") 代码 3.9 没有副作用或var函数 现在才是真正函数式风格了:满眼看不到副作用或者var。...当然,这个函数并不像printArgs方法那样实际打印输出,但可以简单把它结果传递给println来实现: println(formatArgs(args)) 每个有用程序都可能有某种形式副作用...Scala程序员平衡感 崇尚val,不可变对象和没有副作用方法。 首先想到它们。只有在特定需要和判断之后才选择var,可变对象和有副作用方法。...本文节选自《Programming in Scala》 【相关阅读】 Scala编程实例:使用Set和Map Scala编程实例:使用List和Tuple Scala编程实例:带类型参数化数组

1.1K30

3小时Scala入门

除了Array和ArrayBuffer默认引入是可变类型外,其它数据结构默认都是不可变,可以显式scala.collection.mutable引入对应可变容器。 ?...八,列表List 列表和数组相似,都是有序结构,但列表元素是不可变。 并且列表存储结构为递推链表结构,和数组不同。 1,创建列表 ? 2,列表常用操作 ? ? ?...子类如果要重写超类某个属性和方法,需要使用override关键字。 除非超类该属性和该方法为抽象方法,只有声明没有定义。...2,一切皆表达式 Scala中书写每条语句都可以看成是一条表达式表达式基本格式是 name:type = {...}...4,函数式编程 函数特点是操作无副作用,唯一作用生成函数值。 把一个函数作用到一些参数上,不会对输入参数造成改变。 为了逼近这个目标,scala设计默认数据结构绝大部分是不可变

1.6K30

多面编程语言Scala

而在对象组合方面,Scala拥有比接口更加强大武器──特质(trait)。 Scala同时作为一门函数式编程语言,理所当然具备了函数式语言函数为头等“公民”、方法无副作用等特性。...实际上,这无关类型争论,而是类型系统实现范畴。是的,在Scala里,你可以放心大胆使用vals="ABC",而Scala里强大类型推断和模式匹配,绝对会让你爱不释手。...而在Scala没有静态成员(静态字段和静态方法),因为静态成员从严格意义而言是破坏面向对象纯洁性,因此,Scala借助伴生对象来完整支持类一级属 性和操作。...可见,模式匹配特性非常好用,可以灵活应对许多复杂应用场景: 第一个case表达式匹配普通字面量; 第二个case表达式匹配正则表达式; 第三个case表达式使用了if判断,这种方式称为模式护卫(Pattern...Guard),可以对匹配条件加以过滤; 第四个case表达式使用了“_”来处理匹配前面几项情况。

2.5K40

3小时Scala入门

除了Array和ArrayBuffer默认引入是可变类型外,其它数据结构默认都是不可变,可以显式scala.collection.mutable引入对应可变容器。 ?...八,列表List 列表和数组相似,都是有序结构,但列表元素是不可变。 并且列表存储结构为递推链表结构,和数组不同。 1,创建列表 ? 2,列表常用操作 ? ? ?...子类如果要重写超类某个属性和方法,需要使用override关键字。 除非超类该属性和该方法为抽象方法,只有声明没有定义。...2,一切皆表达式 Scala中书写每条语句都可以看成是一条表达式表达式基本格式是 name:type = {...}...4,函数式编程 函数特点是操作无副作用,唯一作用生成函数值。 把一个函数作用到一些参数上,不会对输入参数造成改变。 为了逼近这个目标,scala设计默认数据结构绝大部分是不可变

3.5K20

函数式编程阅读笔记

函数式编程基础来源于“lambda calculus”,这是Alonzo Church一个奇妙想法。 简单来讲,一个函数可以接受另一个函数作为参数也可以输出另一个函数作为结果。...,这个确实很容易造成memory hot,但确实是函数式编程风格 此外,我们来了解下副作用这个概念: 如果一个函数不仅仅只是返回一个值,而且还做了如下事: 1.擅自修改一个变量 2.直接动了数据结构...3.设置一个对象成员 4.抛出一个异常或以一个错误停止 5.打印到终端或读取用户输入 6.读写文件 这个就是副作用概念。...引用透明表达式不会依赖于上下文,可以本地推导,而这些产生了副作用。...) throw new ArithmeticException("wrong") else xs.sum / xs.length 这个函数是一个部分函数,对于一些输入没有定义

44110

就是个控制结构,Scala能有什么新花样呢?

这里首先插一个只有程序员才懂段子: 女朋友对程序员说:“亲爱,去超市买一个西瓜吧,如果他们还有鸡蛋,再买20个”,结果程员带了21个西瓜回家。女朋友愤怒说:“为什么买21个西瓜回来”?...除了if-else这种经典分支结构外,编程语言中另一经典分支结构是switch-case结构,这在Scala中也是有所体现,只不过提供switch,而是支持功能更为强大模式匹配:match-case...应用这一特性,for循环其实还有另一个巧妙运用:由一个迭代器生成另一个迭代器,功能类似于Python中列表推导式。...这一区别意味着:for循环既可以用于迭代产生新迭代结果,也可以依靠历次循环产生相应效果(即执行循环体带来副作用),而while循环则只能靠循环产生副作用来实现功能。...最后值得指出是,与其他编程语言不同,在Scala中并没有break和continue两个关键字,即无法简单实现循环中止或者跳过本次循环这一逻辑。

84620

3小时Scala入门

除了Array和ArrayBuffer默认引入是可变类型外,其它数据结构默认都是不可变,可以显式scala.collection.mutable引入对应可变容器。 ?...八,列表List 列表和数组相似,都是有序结构,但列表元素是不可变。 并且列表存储结构为递推链表结构,和数组不同。 1,创建列表 ? 2,列表常用操作 ? ? ?...子类如果要重写超类某个属性和方法,需要使用override关键字。 除非超类该属性和该方法为抽象方法,只有声明没有定义。...2,一切皆表达式 Scala中书写每条语句都可以看成是一条表达式表达式基本格式是 name:type = {...}...4,函数式编程 函数特点是操作无副作用,唯一作用生成函数值。 把一个函数作用到一些参数上,不会对输入参数造成改变。 为了逼近这个目标,scala设计默认数据结构绝大部分是不可变

1.6K30

从map函数引发讨论

那么,为什么我们还倾向于使用lodashmap函数?反对至为关键理由是: lodashmap函数将可能异常吃掉了! 这里提及异常,指进行map数组可能是undefined。...对undefined做转换,语义上表达了我们对初始化数组进行转换,那就应该保持被转换对象原样,也,就,是——什么都不做! 若站在FP角度,map函数应为无副作用纯函数。...如果我们将初始化数组视为意外而抛出异常,就产生了我们不期望看到副作用。显然,异常抛出玷污了纯函数纯洁无暇。 窃以为:错误是一种意外,却不能成为玷污合法理由。...终审判决是:我们更期望使用lodash这种静悄悄没有副作用map方式。倘若硬要使用ES6map,为了保证程序健壮性,就必须对变量进行这样判断。...无论结果是Some还是None,都可以无挂碍对其进行下一步操作,而将最终结果可能意外判定权交给最后使用那个值客户。换言之,这种设计将可能产生副作用向外推了。

1.4K90

Scala简介:面向对象和函数式编程组合

函数类型是能够被子类继承类。这看上去似乎不外乎学术上美感,但它从深层次上影响了可伸展性。实际上之前看到行动类这个概念如果没有这种函数和对象联合将无法实现。...本节将浏览Scala融合面向对象和函数概念方法。 Scala是面向对象 面向对象编程已经无与伦比成功了。...这就是前例里面显示Scala行动类API定义者如何让你能够使用类似requester!sum这样表达式:“!”是行动类方法。 如果说到对象组合,Scala比多数别的语言更胜一筹。...使用表达式如s.replace(';', '.')在字串里替换字符会产生一个新,不同于原字串s对象。用另一种表达方式来说就是在Java里字串是不可变(immutable)而在Ruby里是可变。...不可变数据结构是函数式语言一块基石。Scala库在Java API之上定义了更多不可变数据类型。例如,Scala有不可变列表,元组,映射表和集。

1.2K60

致开发人员:沉迷面向对象编程不可自拔?函数式编程了解一下

简单说,函数是将输入转换为输出东西。只是事情并没有那么简单。思考一下,在Python中下面这个函数意义: def square(x): return x*x 这个函数很简单。...如果事先没有定义 global_list,那么这个函数就不能工作,它输出是相同列表,尽管经过了修改。...这可能就是问题所在,列表确实是函数一个输入,虽然我们没有明确说明。 1.不忠于函数 这些隐含输入,或者其他情况下输出,有一个官方名称:副作用。...但是,我们已经更改了一件事情:该代码现在没有副作用。 现在,当我们查看函数声明时,能确切知道发生了什么。如果程序运行不正常,我们也可以轻松单独测试每个功能并查明哪个功能有问题。 ?...2.函数式编程正在编写纯函数 具有明确声明输入和输出函数是没有副作用函数,而没有副作用函数就是纯函数。 函数编程一个非常简单定义是:仅用纯函数编写程序。

64230

代码体积减少80%!Taro H5转换与优化升级

类似上面这个代码示意,add2 模块就是存在副作用。...第一步是在模块级别移除使用且无副作用模块,这一步由 webpack 内置插件完成;第二步是在文件级别移除使用代码,这一步由代码压缩工具 Terser 完成。...经过 SideEffectsFlagPlugin 处理后,没有使用过并且没有副作用模块都会被打上 sideEffectFree 标记。...接下来,依靠 Terser,webpack 可以在文件级别,对使用、无副作用代码进行移除。.../utils.js'; add(1, 2); 在使用 ES6 模块系统改造后,可以清楚看到,minus 函数确实没有使用过,所以可以安全将其从最终打包代码中移除。 当然,具体分析过程非常复杂。

3K10
领券