以下是纯函数吗?
function test(min,max) {
return Math.random() * (max - min) + min;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是纯函数遵循以下条件:
如果这个定义是正确的,我的函数是纯函数吗?或者我对定义纯函数的不正确理解是什么?
定义函数的两个条件pure如下:
如果第一个条件始终为真,那么是否有第二次条件不为真?
即真的只有第一个条件才需要吗?
javascript functional-programming language-lawyer pure-function
我读了维基百科对幂等性的解释.我知道这意味着函数的输出是由它的输入决定的.但我记得我听过一个非常相似的概念:纯粹的功能.我谷歌他们但找不到他们的区别......
它们是等价的吗?
纯函数是没有副作用的函数 - 它不能做任何类型的I/O并且它不能修改任何东西的状态 - 并且它是引用透明的 - 当使用相同的输入多次调用时,它总是给出相同的产出.
为什么单词"pure"用于描述具有这些属性的函数?谁首先以这种方式使用"纯"这个词,何时?是否有其他词语意味着大致相同的事情?
functional-programming function purely-functional pure-function
下面是一个名为functionA的高阶函数示例,它将customValue作为输入,并返回一个获取输入并使用自定义值来详细说明结果的函数:
let functionA = (customValue) => {
let value = customValue || 1;
return input => input * value;
};
Run Code Online (Sandbox Code Playgroud)
这是一些结果:
functionA()(4)
// => returns 4
functionA(2)(4)
// => returns 8
functionA(3)(4)
// => returns 12
functionA(4)(4)
// => returns 16
Run Code Online (Sandbox Code Playgroud)
功能A返回的功能可以被认为是纯粹的吗?
更新:以上示例仅使用数字输入.正如@CRice所描述的那样,只有当customValue是常量且没有内部状态(如类)时,返回的函数才能被认为是纯函数.
例如,一个没有自由变量的引用透明函数:
g op x y = x `op` y
Run Code Online (Sandbox Code Playgroud)
现在是一个带有自由(从观点来看f)变量的函数op和x:
x = 1
op = (+)
f y = x `op` y
Run Code Online (Sandbox Code Playgroud)
f也是参考透明的.但它是纯粹的功能吗?
如果它不是纯函数,那么引用透明的函数的名称是什么,但是使用一个或多个绑定在封闭范围内的变量?
这个问题的动机:
从维基百科的文章中我不清楚:
结果值不需要依赖于所有(或任何)参数值.但是,它必须仅依赖于参数值.
(强调我的)
也不是从谷歌搜索纯函数是否可以依赖于free(在一个封闭范围中绑定的意义上,而不是在函数范围内绑定)变量.
另外,这本书说:
如果没有自由变量的函数是纯粹的,那么闭包是不纯的吗?
功能
function (y) { return x }很有趣.它包含一个自由变量x.自由变量是未在函数内绑定的变量.到目前为止,我们只看到了一种"绑定"变量的方法,即通过传入一个具有相同名称的参数.由于该函数function (y) { return x }没有名为x的参数,因此变量x未在此函数中绑定,这使其"自由".现在我们知道函数中使用的变量是绑定的还是空闲的,我们可以将函数分为具有自由变量的函数和不具有以下函数的函数:
- 不包含自由变量的函数称为纯函数.
- 包含一个或多个自由变量的函数称为闭包.
那么"纯函数"的定义是什么?
看过很多纯函数以及它们如何没有副作用,什么是不纯函数的例子,它总是被作为不稳定和主要错误来源而被对抗?
在玩D 2.0时,我发现了以下问题:
例1:
pure string[] run1()
{
string[] msg;
msg ~= "Test";
msg ~= "this.";
return msg;
}
Run Code Online (Sandbox Code Playgroud)
这编译并按预期工作.
当我尝试将字符串数组包装在一个类中时,我发现我无法使其工作:
class TestPure
{
string[] msg;
void addMsg( string s )
{
msg ~= s;
}
};
pure TestPure run2()
{
TestPure t = new TestPure();
t.addMsg("Test");
t.addMsg("this.");
return t;
}
Run Code Online (Sandbox Code Playgroud)
此代码将无法编译,因为addMsg函数不纯.我不能使该函数纯,因为它改变了TestPure对象.我错过了什么吗?或者这是一个限制?
以下编译:
pure TestPure run3()
{
TestPure t = new TestPure();
t.msg ~= "Test";
t.msg ~= "this.";
return t;
}
Run Code Online (Sandbox Code Playgroud)
〜=运算符是否会被实现为msg数组的不纯函数?为什么编译器不会在run1函数中抱怨它?
我正在阅读 Scala 编程这本书,据说:
...在这种情况下,它的副作用是打印到标准输出流。
我没有看到副作用在哪里,因为对于相同的输入, println 将打印相同的输出(我认为)
UPDATE
例如,每当我们调用:
println(5)
Run Code Online (Sandbox Code Playgroud)
它将打印5,我没有看到调用println(5)会打印 5 以外的值的情况!