问题标签 [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 投票
1 回答
349 浏览

scala - scala中map和for循环的意外副作用

也许是一个简单的问题,但我没有从 API 中找到令人满意的答案。我不是想写好的代码,而是想更多地了解某些事情是如何工作的:

我创建了一个初始 HashMap。从任意列表中,我想使用 map 来创建 HashMaps 列表。我在 .map 函数中向我的 HashMap 添加了一个(键,值)对。因此,在此列表中的任何连续索引中,存储的 HashMap 的大小应该增加一(因此 list(i).size == list(i+1).size - 1 对于每个 i)。

但是通过以下代码剪辑,我得到了一个映射列表,它们都是相等的(即完整的 HashMap)。不过,如果我打印出不断增长的初始 HashMap 一切似乎都是正确的。

我所期望的是

列表(地图(1 -> 2),地图(1 -> 2, 2 -> 4),地图(1 -> 2, 2 -> 4, 3 -> 5),地图(1 -> 2, 2 - > 4, 3 -> 5, 4 -> 6))

使用生成 for 循环的等效(我假设是)版本会产生完全相同的结果:

我想我错过了一个基本步骤,但我只是看不出是哪个。我感谢任何进一步的帮助!

随后的问题:显然,(键,值)对的打印顺序总是相同的(尽管不是按照它们是元素的顺序,但我不希望 Map 无论如何,这是自然的)。当存储对时,后台会发生什么情况似乎总是如此?

0 投票
2 回答
127 浏览

list - Haskell:为什么这会导致空列表异常?

我目前从事 Project Euler 的工作是为了好玩,并使用 Haskell 进行练习。但是,我遇到了一个问题,我似乎无法生成一个更小的示例,所以这里是代码(对于项目 euler 232):

请忽略这里的不良风格:)

如果我在这里加载并运行 sumBuild(7, 5) ,我会得到一个异常:

但是,如果我将 sumBuild 更改为:

或者

然后它运行良好。

这对我来说真的很困惑,因为没有副作用,而且两次运行会产生不同的结果(至少看起来是这样)。这里有什么问题?

如果有人可以将此程序编辑为最小的工作示例,那么我真的很感激!

谢谢你的帮助!

0 投票
2 回答
1198 浏览

haskell - Haskell - Print a Trace After Execution

I have a project for Uni to write a compiler (in Haskell) for a simple made-up imperative language. One of the requirements is printing debug statements on entering a function call, leaving a function and assigning variables.

Printing messages when entering functions is easy, I just use Debug.trace, eg:

The same process applies when assigning to variables. What I can't figure out is how to print when returning from a function call and have the output timed correctly with the other outputs. Every attempt I've made so far has resulted in "Leaving function" being printed immediately after "Entering function" - I need the function's internal debug statements (assigning and nested function calls) to be printed before "Leaving function" is printed.

My imperative habits tell me that I need a way to force execution of (evaluateFunction functionArguments) before the leave-function output, but this seems impossible and wrong in Haskell.

Example output I get now:

Same program's output the way I need it to look:

So, what's Haskell idiom for 'run myFunctionWithTraces then print myString'?

0 投票
2 回答
317 浏览

c# - 是否通过 LINQ Select 调用错误代码产生新线程?

ReSharper 重构了一个 foreach 循环,我不得不这样做。我想通过委托的 BeginInvoke 使用不同的参数生成一堆线程,存储在列表中,并将 IAsyncResults 存储在集合中:

我的本能反应是,这不是一个好习惯。BeginInvoke 导致产生新线程的副作用,传递给 Select 的函数不应引起副作用。

或者也许没关系,因为我没有更改调用线程中的任何内容?

0 投票
2 回答
111 浏览

collections - 什么决定了何时创建集合?

如果我理解正确,Clojure 可以返回列表(就像在其他 Lisps 中一样),也可以返回向量和集合。

我真正不明白的是为什么并不总是有一个集合被返回。

例如,如果我采用以下代码:

它确实打印了 128 64 32 16 8 4 2。但这只是因为println被调用并且println具有打印某些东西的副作用(?)。

所以我尝试用这个替换它(删除println):

我期待得到一些收集(据说是一个列表),像这样:

但相反,我得到了nil

我不明白哪个决定了什么创建一个集合,什么没有,以及你如何从一个切换到另一个。此外,看到 Clojure 以某种方式鼓励了“函数式”编程方式,您不应该几乎总是返回集合吗?

为什么有这么多显然不返回任何集合的函数?制作这些退货系列的惯用方式是什么?

例如,我将如何通过首先构造一个集合然后以一种惯用的方式迭代(?)而不是生成的列表/向量来解决上述问题?

首先,我不知道如何转换循环以使其产生除nil以外的其他内容,然后我尝试了以下操作:

但它打印“1 2nil 3nil”而不是我期待的“1 2 3nil” 。

我意识到这是基本的东西,但我才刚刚开始,我显然在这里缺少基本的东西。

(PS:适当地重新标记,我不知道我应该在这里使用哪些术语)

0 投票
4 回答
2421 浏览

ocaml - OCaml 中的副作用和顶级表达式

我遇到了ocaml的麻烦。

我想创建一个函数,每次调用它时都会增加我的计数器,并将我的 vargen 字符串与计数器编号连接起来并返回这个新字符串。

我没有成功的做法是:

但我的输出总是:

我的输出应该是:

有什么想法可以解决我的问题吗?

谢谢大家。

0 投票
2 回答
391 浏览

javascript - 有没有办法确定 JavaScript 函数是否有副作用?

给定一个 Javascript 函数,是否可以验证该函数没有副作用;即,该函数不会更改在函数范围之外声明的任何变量的值?

0 投票
5 回答
9722 浏览

functional-programming - 为什么引发异常会产生副作用?

根据副作用的维基百科条目引发异常构成副作用。考虑这个简单的python函数:

调用它foo(None)总是会遇到异常。一样的输入,一样的输出。它是参照透明的。为什么这不是纯函数?

0 投票
3 回答
5890 浏览

algorithm - 哪些算法难以用函数式语言实现?

我正在涉足函数式语言,我发现一些算法(尤其是那些使用动态编程的算法)更难编写,有时在最坏的情况下运行时效率更低。是否有一类算法在具有不可变变量和副作用的函数式语言中效率较低?

有没有人可以指点我的参考资料,这将有助于编写更难的算法(可能是那些通过共享状态优化的算法)?

谢谢

0 投票
1 回答
183 浏览

compiler-optimization - SSA 中的副作用跟踪

我正在研究 Java 字节码的优化器,并决定使用 SSA。然而,大多数优化要求所有操作都是纯函数式的,因此为了处理副作用,我决定为每个可能产生副作用的操作添加一个额外的不透明状态参数和返回值。这将防止优化或重新排序具有副作用的操作。例如,忽略异常处理,你会得到类似这个伪代码的东西。

我在做什么有名字吗?这是一个好方法吗?听说函数式语言有一个概念叫Monads,听上去很像但又不一样。使用单子是更好的方法吗?如果是这样,我该如何修改它以使用单子?