Functional programming 在函数式编程中,一个函数能否调用在其外部声明的另一个函数';s范围,而不是作为参数传递?

Functional programming 在函数式编程中,一个函数能否调用在其外部声明的另一个函数';s范围,而不是作为参数传递?,functional-programming,Functional Programming,使用在其使用的函数范围之外声明的函数是否违反了诸如不变性之类的函数原则?或者这是专门指数组、字符串等数据 例如: var data ["cat", "dog", "bird"]; function doThing (val) { return val + ", go away!" } function alterData (data) { return data.map(doThing); } alterData(data); 上述代码是否可以接受?或者需要将“do

使用在其使用的函数范围之外声明的函数是否违反了诸如不变性之类的函数原则?或者这是专门指数组、字符串等数据

例如:

var data ["cat", "dog", "bird"];

function doThing (val) { 
     return val + ", go away!" 
}

function alterData (data) {
    return data.map(doThing);
}

alterData(data);
上述代码是否可以接受?或者需要将“doThing”函数作为参数传递到alterData函数中吗

我之所以感到困惑,是因为在函数编程示例中,我经常看到使用的是该语言的本机函数,而没有首先传递给函数。然而,这些示例从未复杂到足以说明如何使用函数库

关于

TL;博士 在FP代码中依赖作用域是可以的


不变性意味着由名称表示的内容不能更改其值。不过,我不会把它称为函数式编程的“原则”

无论如何,这与范围界定无关。如果您想将一个函数参数化,而不是将另一个函数参数化,则将其作为参数传递是有意义的——本质上是使其成为高阶函数。这方面的一个很好的例子是
折叠
(也称为
减少
)-但
映射
也是一个例子

不过,在您的情况下,
alterData
函数并没有增加多少价值<代码>映射将某个东西ping到某个东西上非常常见,因此通常最好只提供一个元素函数,因为它基本上更易于重用


如果您将
doThing
传递给
alterData
,则会使该函数基本上无用;如果我能简单地使用
map
,我为什么要使用它呢?但是,将操作与映射打包在一起有时可能是一种有用的抽象。

函数式编程与过程式编程没有什么不同,在这方面,您编写的定义可以在范围内的任何地方重用。您可以通过各种机制控制范围内的内容,例如模块定义、模块导出列表和模块导入。例如(在Haskell中):


照现在的样子做点什么也没关系。 您需要这样做:

var data = ["cat", "dog", "bird"];

var doThing = function (val) { 
     return val + ", go away!" 
}

function alterData (data) {
    return data.map(doThing);
}

alterData(data);

我删除了“immutability”标记,因为它完全不相关。你是对的,不是一个好的标记。假设
alterData
函数是一个纯函数,它依赖
doThings
函数具有可预测的行为。如果
doThings
函数更改其功能或被删除怎么办?然后,
alterData
的行为改变,这意味着它不是纯粹的。所以在FP中,我们不应该依赖作用域函数,我们应该传递函数用作参数的任何内容。
var data = ["cat", "dog", "bird"];

var doThing = function (val) { 
     return val + ", go away!" 
}

function alterData (data) {
    return data.map(doThing);
}

alterData(data);