问题标签 [side-effects]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1517 浏览

java - 模拟模拟方法的副作用

我在一个类中有一个方法会对该方法的参数产生副作用:

并且正在测试这个类:

我使用 JMockit 的测试方法:

0 投票
3 回答
667 浏览

haskell - 我将如何想象 Haskell 中基于像素的渲染?

想象一下一个命令式渲染引擎,它将精灵 blits 到稍后显示的位图。这在很大程度上依赖于有效地改变所述位图中的单个像素的能力。我将如何在没有副作用的情况下做这样的事情?我猜需要一个完全不同的数据结构?

0 投票
2 回答
273 浏览

functional-programming - OCaml:存储一些稍后使用的值是否会引入“副作用”?

对于家庭作业,我们被指示在不引入任何“副作用”的情况下完成任务。我在 Wikipedia 上查找了“副作用”,虽然理论上我明白这意味着“修改状态或与调用函数有可观察的交互”,但我无法弄清楚具体细节。

例如,创建一个包含非编译时结果的值会引入副作用吗?

假设我有(可能在语法上并不完美):

这会带来副作用吗?我想也许我对副作用定义中的“修改状态”意味着什么感到困惑。

0 投票
3 回答
2803 浏览

c++ - 将对象传递给 C++ 中的函数时的副作用

我在书中读过C++ : The Complete Reference以下内容

即使对象是通过正常的按值调用参数传递机制传递给函数的,理论上这种机制可以保护和隔离调用参数,但仍有可能发生可能影响甚至损坏的副作用, 用作参数的对象。例如,如果用作参数的对象分配内存并在销毁时释放该内存,则函数内部的本地副本将在调用其析构函数时释放相同的内存。这将使原始对象损坏并且实际上无用。

我真的不明白副作用是如何发生的。任何人都可以通过一个例子帮助我理解这一点吗?

0 投票
2 回答
672 浏览

java - 如何避免副作用?

为避免副作用:我不想在我的方法中更改参数对象属性值。我更喜欢创建一个新的来代表结果并返回它。

避免副作用仅在多线程环境中非常重要,但仍然是一个很好的实践。f(X)=Y ,能够比较两个对象是很好的,一个 u 作为参数接收,一个 u 作为结果给出。

这意味着,我需要将我的 IN 参数对象中的所有属性映射到我创建的 OUT 新实例对象。这将使一些代码像:

它可以在我的方法中产生很多行:$

我也可以不用映射那么多值,只需添加一行

但这最终会导致访问数据库和更多处理。

做一些使用反射的通用方法,将一个对象映射到另一个对象?在性能方面,这将是昂贵的。

你会选择什么?视项目需求而定。考虑到可维护性、可扩展性...

0 投票
0 回答
414 浏览

types - 除赋值以外的命令式语句的类型推断

在我搜索有关命令式语言类型系统的研究论文时,我只找到了具有可变引用但没有真正的命令式控制结构(如复合运算符、循环或条件)的语言的解决方案。

因此,尚不清楚如何实现具有部分类型推断的命令式语言(例如http://rust-lang.org)。

这些论文没有提到参数化类型,例如List of a因为参数化类型是 Hindley-Milner 类型系统的一个简单扩展 - 只有统一算法应该扩展,其余的推理按原样工作。但是,分配不能简单地添加,因为会出现悖论,因此必须应用特殊技术,例如 ML 值限制。

您能否推荐任何描述具有命令式循环、条件、IO 和复合语句的语言的类型系统的解析器或书籍?

0 投票
6 回答
22063 浏览

javascript - 简明英语的 Javascript 闭包和副作用?(分别地)

我一直在阅读一些 JavaScript 书籍,并且总是听说闭包和副作用。出于某种原因,我无法理解它们的真正含义。谁能用简单的英语和例子向我解释它们是什么?(正如您向具有图形设计师编程水平的人解释的那样)。

0 投票
5 回答
1232 浏览

haskell - 惰性求值与 IO 副作用混淆

此代码(取自Learn You A Haskell):

显然脱糖

据我了解,它可以解释为“为了 putStrLn “Andy!”,我首先需要 putStr “I'm”,为了做到这一点,我首先需要 putStr “Hey,”;

我不同意这种解释,这很烦人,因为编译器显然没有,让我感到困惑。我遇到的问题是 lambdas 忽略了他们的论点,在惰性评估期间,这种事情不应该被识别和短路吗?

此外,当然,绑定返回一个 IO 操作,当该 IO 操作进入 main 时,它会被执行。但是如何阻止它打印“嘿,安迪!我是”?我怀疑这是绑定在做什么。

此外,“IO ()”类型的 IO 操作如何携带足够的信息以允许运行时系统打印“嘿,我是安迪!”?IO () 与 IO () 相比打印“Hello World!”有何不同?或写入文件?

考虑另一个,来自 monad 的维基百科页面:

加糖版:

脱糖版本:

类似的故事在这里。

我想我只需要查看 IO 绑定的定义,然后就一切都清楚了。如果有人可以帮助我逐步了解程序的实际评估方式并确定副作用发生的确切时刻,那么其他会很有帮助的事情。

0 投票
6 回答
737 浏览

haskell - 如果你编译一个没有输入的程序会发生什么?(Haskell IO 纯度问题(再次))

putStrLn当使用任何参数调用时,将始终返回 type 的值IO ()。我同意这是纯粹的,我可以处理。但它是参照透明的吗?我认为是这样,因为对于任何给定的输入,您都可以将函数调用替换为IO ()将在标准输出中抛出正确字符串的函数调用。

所以我很酷putStrLn,但是getLine当不带参数调用时可以返回任意数量的东西,只要它们是 type IO String。这既不是纯粹的,也不是参照透明的,对吧?

愚蠢的迂腐问题,它可能不会改变我编写代码的方式,但我真的想一劳永逸地解决这个问题。(我知道 IO monad 会正确排序,这不是我的问题)

这对我提出了另一个问题。编译器是否足够聪明,可以识别不需要输入的程序?例如说我编译

GHC 是否足够聪明,可以将该程序简化为IO ()导致 [2,3,4,5,6,7,8,9,10,11] 被打印出来的程序?还是它仍然可以解决并在运行时评估/执行所有内容?对于不需要输入的任意程序也是如此。GHC 是否采用了整个程序是引用透明的并且可以简单地用它的值替换的事实?

0 投票
3 回答
3956 浏览

functional-programming - 考虑到没有副作用,以函数式语言使用数据库的最常见模式是什么?

我试图了解功能语言的核心概念:

“函数式语言的一个核心概念是函数的结果取决于其输入,并且仅取决于其输入。没有副作用!”

http://www.haskell.org/haskellwiki/Why_Haskell_matters#Functions_and_side-effects_in_functional_languages

我的问题是,如果一个函数只在其本地环境中进行更改并返回结果,它如何与数据库或文件系统交互?根据定义,这不是访问实际上是全局变量或全局状态的东西吗?

用于解决或解决此问题的最常见模式是什么?