问题标签 [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.
scala - Scala 中的副作用
这些天我正在学习 Scala。我对 Haskell 有一点熟悉,尽管我不能声称自己很了解它。
给不熟悉 Haskell 的人的附注
我喜欢 Haskell 的一个特点是,不仅函数是一等公民,而且副作用(让我称之为动作)也是一等公民。一个动作,在执行时会给你一个 type 的值a
,属于一个特定的 type IO a
。您可以像传递任何其他值一样传递这些操作,并以有趣的方式将它们组合起来。
事实上,结合副作用是 Haskell 中对它们做某事的唯一方法,因为你无法执行它们。相反,将main
执行的程序是您的函数返回的组合操作。这是一个巧妙的技巧,它可以让函数变得纯粹,同时让你的程序实际上做一些除了消耗能量之外的事情。
这种方法的主要优点是编译器知道您执行副作用的代码部分,因此它可以帮助您捕获错误。
实际问题
在 Scala 中是否有某种方法可以让编译器类型为您检查副作用,例如,您可以保证不会在某个函数内执行副作用?
ruby - 从 FP 的角度来看,在 YARV Ruby 中创建线程通常被视为副作用吗?
如果 Ruby 方法创建线程,但在方法中连接它们,从函数式编程的角度来看,这是否仍被视为副作用?我正在使用的实现是 YARV Ruby,其中线程由操作系统创建,尽管使用 GVL(全局 VM 锁)。
创建线程的原因是进行system
调用,这无论如何都是副作用,但我从未遇到任何人说线程是否是副作用。
简化的伪代码如下所示:
iphone - iPhone应用程序的副作用
有没有办法衡量 iphone 应用程序对其他应用程序性能的副作用?至少使用黑盒焦点。
关于这种方向的监控应用程序有什么建议吗?
我发现我的应用程序对其他应用程序一无所知,但我想衡量我的应用程序对其他应用程序的某种影响,或者在无法估计整体系统性能的情况下。
谢谢你的帮助
c++ - 为什么“volatileQualifiedExpr + volatileQualifiedExpr”不一定是 C 中的 UB,而是 C++ 中的 UB?
当我今天阅读 C 标准时,它说的是副作用
访问 volatile 对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用
和 C++ 标准说
访问由 volatile glvalue (3.10) 指定的对象、修改对象、调用库 I/O 函数或调用执行任何这些操作的函数都是副作用
因此,因为两者都禁止在同一个标量对象上发生未排序的副作用,所以 C 允许以下情况,但 C++ 使其成为未定义的行为
我是否正确阅读规范?如果是这样,差异的原因是什么?
python - 为什么奇怪的列表理解行为有副作用?
我知道在 Python 列表推导中使用副作用不是一个好习惯。但我不明白为什么会发生以下情况:
无论这是否是好的做法,列表理解的内部不应该做一些可预测的事情吗?如果以上是可以预测的,有人可以解释为什么只remove
发生了三个操作,为什么偶数条目是剩下的?
macros - 宏应该有副作用吗?
宏扩展可以(或应该)有副作用吗?例如,这是一个宏,它实际上在编译时抓取网页的内容:
然后,我可以做(foo "http://www.pointlesssites.com/")
,它将被替换为"\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\r\n\t <and so on>"
这是好习惯吗?我是否保证 Racket 只会运行此代码一次?如果我(display "running...")
在宏中添加一行,它只会打印一次,但我不想从一个例子中概括......
PS - 我问的原因是因为我实际上认为这有时真的很有用。例如,这是一个库,它允许您(在编译时)从 Google API Discovery 服务加载发现文档并自动为其创建包装器。我认为如果库实际上是从网络而不是从本地文件中获取发现文档,那将是非常酷的。
另外,举一个具有不同类型副作用的宏的示例:我曾经构建了一个宏,它将 Racket 的一小部分转换为(eta 扩展的)lambda 演算(当然,它仍然可以在 Racket 中运行)。每当宏完成函数的翻译时,它会将结果存储在字典中,以便以后调用宏可以在自己的翻译中使用该函数定义。
javascript - 在 JavaScript 中链接复合赋值运算符
在 C# 中,
写道abcabcabc
(http://ideone.com/pFNFX2)。这很好,因为 C# 规范在第 7.16.2 节中明确指出
该操作被评估为 x = x op y,除了 x 只被评估一次。
但是,在阅读 ECMAScript 5.1 语言规范第 11.3.2 节中对复合赋值运算符的描述时,我在该运算符的语义中没有看到这样的“仅一次”限定符。相反,我看到的是:
- 令 lref 为评估 LeftHandSideExpression 的结果。
- 令 lval 为 GetValue(lref)。
- 令 rref 为评估 AssignmentExpression 的结果。
- 设 rval 为 GetValue(rref)。
- 令 r 为将运算符 @ 应用于 lval 和 rval 的结果。
- 如果以下条件都为真,则抛出 SyntaxError 异常:(截断)
- 调用 PutValue(lref, r)。
- 返回 r。
因此,看起来(对我来说,无论如何)以下 JavaScript 代码
会提醒abcabcabcabc
(因为括号表达式中第 7 行的 PutValue),但是无论如何在 Chrome 22 中,它都会提醒abcabcabc
.
所以我的问题是:我是误读了规范,还是 Chrome(也许是 V8?)做自己的事情不符合规范,可以这么说?
c++ - C++ 中的副作用和可观察行为如何相关?
C++03 标准 1.9/6 定义了可观察的行为:
抽象机的可观察行为是它对易失性数据的读取和写入顺序以及对库 I/O 函数的调用。
然后 1.9/7 定义了副作用:
访问由 volatile 左值 (3.10) 指定的对象、修改对象、调用库 I/O 函数或调用执行任何这些操作的函数都是副作用,它们是执行环境状态的变化。
副作用是可观察到的行为吗?它们是如何相互关联的?
php - PSR-1 2.3 副作用规则
我有一个关于 PHP 基本编码标准 PSR1 的问题。PSR 1 规则 2.3 规定:
规则 2.3 副作用
一个文件应该声明新的符号(类、函数、常量
等)并且不会引起其他副作用,或者它应该执行具有
副作用的逻辑,但不应该两者都做。短语“副作用”是指执行与
声明类、函数、常量等没有直接关系的逻辑,仅来自包含文件。“副作用”包括但不限于:生成输出、显式
使用 'require' 或 'include'、连接到外部服务、修改 ini
设置、发出错误或异常、修改全局或静态变量、
读取或写入一个文件,等等。
有人可以给我一个支持使用此规则的论据吗?或者,解释这条规则的好处,以及为什么它很重要或实施的好主意。这将帮助我支持 PSR 1 的全面实施并提出一个很好的案例。
ruby - 从哈希中删除密钥的非破坏性方法
是否有从哈希中删除键值对的非破坏性方法?
例如,如果你做了
或者
thenoriginal_hash
没有改变,new_hash
也改变了,但它们有点冗长。但是,如果你这样做了
然后original_hash
改变了,这不是我想要的。
有没有一种方法可以满足我的要求?