- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我自己理解函数式编程的不同概念:副作用、不变性、纯函数、引用透明。但是我无法在脑海中将它们连接在一起。例如,我有以下问题:
最佳答案
这个问题需要一些特别挑剔的答案,因为它是关于定义通用词汇的。
首先,一个功能是输入的“域”和输出的“范围”(或共域)之间的一种数学关系。每个输入都会产生一个明确的输出。例如整数加法函数+
接受域中的输入 Int x Int
并产生范围内的输出 Int
.
object Ex0 {
def +(x: Int, y: Int): Int = x + y
}
x
的任何值和
y
, 清楚
+
将始终产生相同的结果。这是一个函数。如果编译器特别聪明,它可以插入代码来为每对输入缓存此函数的结果,并执行缓存查找作为优化。这里显然是安全的。
class Ex1 {
def +(x: Int): Int = x + Random.nextInt
}
x
,
+
可以产生不同的结果(取决于随机值,它不会出现在
+
的签名中的任何地方)。
+
的结果不能如上所述安全地缓存。所以现在我们有一个词汇问题,我们通过说
Ex0.+
来解决这个问题。是
纯 , 和
Ex1.+
不是。
Ex0.+
的结果与其输入相关联
x
和
y
,而且我们不能缓存
Ex1.+
的结果与其输入相关联
x
.我们用来描述可缓存性(或更恰本地说,函数调用与其输出的替代性)的术语是
引用透明度 .
object Ex2 {
var lastResult: Int
def +(x: Int, y: Int): Int = {
lastResult = x + y
lastResult
}
}
Ex2.+
产生的值。对于任何输入
x
和
y
将始终是可缓存的,如
Ex0
.这是引用透明的,但它确实有
副作用 ,用于存储函数计算的最后一个值。其他人可以稍后过来抢
lastResult
,这将使他们对
Ex2.+
发生的事情有一些偷偷摸摸的了解!
A side note: you can also argue that
Ex2.+
is not referentially transparent, because although caching is safe with respect to the function's result, the side effect is silently ignored in the case of a cache "hit." In other words, introducing a cache changes the program's meaning, if the side effect is important (hence Norman Ramsey's comment)! If you prefer this definition, then a function must be pure in order to be referentially transparent.
Ex2.+
连续两次或多次使用相同的输入,
lastResult
不会改变。调用n次方法的副作用相当于只调用一次方法的副作用,所以我们说
Ex2.+
是
幂等 .我们可以改变它:
object Ex3 {
var history: Seq[Int]
def +(x: Int, y: Int): Int = {
result = x + y
history = history :+ result
result
}
}
Ex3.+
,历史改变了,所以函数不再是幂等的。
Ex2
和
Ex3
.他们引入了可变
var
s。
Ex2.+
的副作用和
Ex3.+
是变异他们各自的
var
!所以可变性和副作用是相辅相成的。仅对不可变数据进行操作的函数必须没有副作用。它可能仍然不是纯的(也就是说,它可能不是引用透明的),但至少不会产生副作用。
关于scala - 不同函数式编程概念之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12115312/
我刚刚更新了 Ruby,现在我在尝试启动 compass 时遇到以下错误: Encoding::CompatibilityError on line ["28"] of /usr/local/Cell
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在我的 iOS 应用程序中开发可折叠/ Accordion 式的功能。这将是您可以在网站上找到的典型 FAQ 类型功能。我想点击标题,然后显示详细信息。 因为这是帮助部分,只有几个项目,我认
我正在尝试设计一个基于 REST 的 Web 服务来与我正在开发的农场动物管理系统进行交互。 为了详细说明问题,我收藏了动物 属于一个农场。每只动物都有自己的信息——例如姓名、身份证号、品种年龄等。因
我有 3 种不同的表单,其中复选框数量不同,每个部分基本上代表一个表单,因此当用户选择该部分中的复选框时,它会显示他们在该部分的总金额中 checkout 了多少 HTML
我有一份 32 页的 PDF 版家谱。与其将家谱全部放在一个非常大的 PDF 页面上(这是我想要的),不如将其格式化为一组 8 个单独的美国信纸大小的页面应该在整个宽度上缝合; 4 行这样就完成了树。
指SASS implementation for Java? : 在 Maven 目标编译包中自动编译 compass-style.org 样式表的最佳方法是什么? 我不想发送太多的自编译库,也不想通
鉴于以下 XAML... 我正在寻找一种绑定(bind) ComboBox、Button 和 Command 的方法,以便当 ComboBox 的值更改时,在 Command 上调用 CanExe
在玩具应用程序中,我有一个显示所有帖子标题的“帖子”模板。当您单击每个标题时,我不想直接进入“显示” View ,而是直接内联展开该帖子的其余内容。 我考虑过让 postRoute 重用 postsR
我需要一些使用 Twitter Bootstrap 或其他响应式框架的自定义 Swagger-UI 实现。需要在我的移动设备上使用这样的 UI 测试我的 API,但 swagger-ui 不能很好地扩
我正在做一个项目,我真的在尝试编写面向对象的 JavaScript 代码。我刚刚开始阅读Douglas Crockford's JavaScript: The Good Parts我很快开始意识到用
在 C# 中,我通过执行以下操作来加密文本数据(请注意我正在以 block ( block )的形式加密数据): public string EncryptData(string pu
我正在构建一个社交网站,该网站将向全世界公开 REST API (WCF WebAPI),以便任何开发人员都能够为该网站创建客户端应用程序、将其与其他服务集成等。 我想为 API 实现 Faceboo
我是一名优秀的程序员,十分优秀!