问题标签 [pure-function]
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.
java - 在 Java 中,所有这些方法都被视为纯函数吗?
该程序确定用户输入的字符串是否为回文。
公共类 PurePalindrome 扩展 ConsoleProgram {
}
所有这些方法都会被认为是纯函数吗?如果不是,为什么不呢?我在确定一个方法是否是纯函数时遇到了一些麻烦。
haskell - 使用读取后不改变的参数
我正在学习 Haskell 并编写一个程序来解决一个玩具问题。程序使用的参数k在从文件中读取参数后在运行时不会更改。我对使用纯函数很陌生,我想尽可能多地编写纯函数。
我有一个数据类型Node
,以及比较节点、获取节点后代等的函数。目前,所有这些函数都以参数k作为参数,例如
每当我必须在函数中递归调用其中任何一个时,我都必须重复k参数。这似乎是多余的,因为k对于这些函数永远不会有不同的值,并且因为它降低了类型签名的可读性,如果可能的话,我想重构它。
是否有任何策略可以使用纯函数来做到这一点,或者这仅仅是我必须处理的限制?
我所想到的
早些时候我在顶层硬编码k ,它似乎工作(我能够在函数中使用k而不需要它作为显式参数)。但是,一旦我需要从文件中读取输入,这显然是不可行的。
另一种可能的策略是在函数中定义所有这些函数main
,但在 Haskell 中似乎强烈反对这样做。
haskell - 纯函数可以有自由变量吗?
例如,一个没有自由变量的引用透明函数:
A 现在是一个具有自由(从 的角度f
)变量op
和的函数x
:
f
也是参照透明的。但它是纯函数吗?
如果它不是纯函数,那么引用透明但使用绑定在封闭范围内的 1 个或多个变量的函数的名称是什么?
这个问题的动机:
从Wikipedia的文章中我不清楚:
结果值不必依赖于所有(或任何)参数值。但是,它必须依赖于参数值。
(强调我的)
谷歌也没有搜索纯函数是否可以依赖自由(在被绑定在封闭范围内,而不是在函数范围内绑定的意义上)变量。
另外,这本书说:
如果没有自由变量的函数是纯函数,那么闭包是不纯的吗?
该功能
function (y) { return x }
很有趣。它包含一个自由变量 x。自由变量是未绑定在函数内的变量。到目前为止,我们只看到了一种“绑定”变量的方法,即传入一个同名的参数。由于该函数function (y) { return x }
没有名为 x 的参数,因此变量 x 未绑定在此函数中,这使其“自由”。</p>现在我们知道函数中使用的变量要么是绑定的,要么是自由的,我们可以将函数分为具有自由变量和没有自由变量的函数:
- 不包含自由变量的函数称为纯函数。
- 包含一个或多个自由变量的函数称为闭包。
那么“纯函数”的定义是什么?
gcc - GCC 和 Clang:关闭纯优化
我正在运行一组比较不同的 libc 字符串函数的基准测试。问题是 GCC 和 Clang 正在优化循环中的计算,因为这些函数被标记为“纯”和“常量”。有什么方法可以关闭优化或绕过它?
c# - 只有在操作原始类型时才能保证 PureAttribute 吗?
JetBrains 注释:
表示方法不进行任何可观察到的状态更改。与 System.Diagnostics.Contracts.PureAttribute 相同
微软代码合同:
表示一个类型或方法是纯的,也就是说,它不会进行任何可见的状态更改。
使用原始类型操作时,很容易知道您的方法是否是纯函数。
但是考虑这种情况:
ReSharper 告诉我“未使用纯方法的返回值”,这显然是不正确的,因为状态确实会以一种非常明显的方式发生变化。当然,除非他们的意思是任何静态方法总是纯的?否则,没有一个 LINQ 扩展方法是纯的,因为我可以在覆盖 GetEnumerator() 时进行各种状态操作。
clojure - 在垃圾收集之前执行操作
我想在不再引用特定实体之后,但在垃圾收集器擦除其数据之前对特定实体执行一些操作。我正在使用它进行更多“纯功能” gui抽象的实验。这是我想做的:
在 A 处创建一个具有宽度和高度的窗口实例。最终我想更改 B 处的窗口。代码将其视为不可变的操作,但窗口下方将简单地更改以反映更改。在 B 作用域的窗口存在时(在多线程的情况下)在 A 作用域的窗口上执行的操作以某种方式是不允许的。
在 C 处,我们在 B 处完成操作并离开 let 范围后,B 窗口对象将被取消引用并被垃圾收集。但我想向底层窗口机制发出信号,它现在应该回滚 B 更改,并再次接受 A 范围活动。因此,在 C 处的动作就好像 B 效应没有发生一样。
同样,如果不再引用顶级 A 窗口,它应该在垃圾收集之前以任何方式自行破坏。
我可以通过让 make-window 修改注册窗口引用的全局状态来管理这个,但我不确定如何检测 B 范围引用丢失的点。如何检查对一条数据的引用?还是有其他方法可以解决这个问题?
我意识到这是一个有点复杂的设置,但我想找到一种方法来协调 gui 编程的状态性并使其看起来尽可能纯粹。
javascript - 现代 JavaScript 引擎是否针对纯函数执行优化?
在提倡纯函数的同时,我还想提到性能作为一个优势,虽然我知道传统的函数式语言对它们进行了大量优化(我假设 haskell 中的所有内容都被神奇地记忆了),但我不知道 JS 的情况如何。
我写了一个小的 jsperf,它确实证明了一个非平凡的纯函数比副作用快得多,但基准可能完全被打破。( http://jsperf.com/automatic-memoization )
c++ - 使用虚拟纯函数访问字段的分段错误
我阅读了很多关于纯虚拟调用错误的信息,但我没有弄清楚我的代码有什么问题:
我使用多态性编写了国际象棋游戏。
这里有一些代码:
Piece.hpp(所有游戏片段的父级)
Rook.hpp(例如)
和 Rook.cpp
板::板()
板::打印
我被困在那条线上:
pieceUnicode = board[i][j]->getUnicodeSymbol();
我得到:
纯虚方法调用
我没有在构造函数或析构函数中调用函数
把virtual
关键字放到上面的~Piece()
析构函数之后,这个问题就解决了。但现在我在同一条线上
信号:SIGSEGV(分段错误)
有任何想法吗?
这里有更多信息:
我在 chess.cpp 的 main 中声明棋盘:
棋盘游戏;
然后我像这样发送到 void playGame(Board boardGame):
玩游戏(棋盘游戏);
在里面我发送到 void getNextMove(Board board, string whitePlayer, string blackPlayer) 像这样:
getNextMove(boardGame, whitePlayer, blackPlayer);
然后我正在使用:
boardGame.print();
mysql - 如何在 MySQL 中设置 now() 的输出?
我们希望在测试比较实际值和预期值时对 MySQL 存储过程和函数运行自动化测试。
问题是,即使我们在每次测试之前运行一个夹具脚本,我们的大多数例程都可以在给定相同输入的情况下返回不同的结果——我们做了很多依赖于now
. (now
是用于返回当前日期时间的内置函数。)
我们如何“冻结”now
测试数据库中返回的内容?
我能想到的最佳解决方案是将所有调用替换为now
对自定义函数的调用。在我们的 prod 数据库中,这个自定义函数只会调用内置的now
,而在我们的 dev 数据库中,它将返回一个静态日期。
有没有更简单的方法,比如SET global.CURRENT_TIME = '2015-01-01 00:00:00';
?
c++ - GCC `__attribute__ ((pure))` 关于“输入状态”getter 方法的建议 - 正确吗?
编译-Wsuggest-attribute=pure
使 GCC 建议潜在的函数,这些函数可以标记__attribute__ ((pure))
为优化目的。
这是GCC 文档上的定义:pure
许多函数除了返回值外没有任何影响,它们的返回值仅取决于参数和/或全局变量。这样的函数可以像算术运算符一样进行公共子表达式消除和循环优化。这些函数应该用纯属性声明。
我正在创建一个小型游戏引擎,其中有一个input_context
包含input_state
成员的类。该类通过从操作系统获取全局输入状态来input_context
更新每个帧的成员。input_state
它还包含几个“getter”来查询输入状态。
简化示例:
GCC 告诉我所有这些“getter 方法”,比如和mouse_x()
,都是.mouse_y()
is_key_down()
__attribute__ ((pure))
我应该将这些方法标记为pure
吗?
我不这么认为,但 GCC 的建议让我对此感到好奇。
我不确定如何解释 GCC 的定义pure
——它说只依赖参数和/或全局变量的函数应该被标记为这样。
在某种程度上,全局 OS 输入状态可以解释为全局变量。
另一方面,“getter 方法”总是返回不同的值,具体取决于
_input_state
成员变量。