在函数式编程中,函数是否可以调用在其范围之外声明的另一个函数而不作为参数传递?

时间:2015-10-30 15:56:21

标签: functional-programming

使用在函数范围之外声明的函数是否违反了函数原则,如immutability?或者这是指数组,字符串等数据。

例如:

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

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

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

alterData(data);

上述代码是否可以接受?或者“doThing”函数是否需要作为参数传递给alterData函数?

我感到困惑的原因是因为在函数式编程示例中,我经常看到正在使用的语言的本机函数,而不是首先传递给函数。但是,这些示例从未足够复杂,无法显示如何使用函数库。

此致

3 个答案:

答案 0 :(得分:1)

TL; DR

依靠FP代码中的范围很好。

不变性意味着由名称代表的东西不能改变其价值。我不会称之为"原则"但是,函数式编程。

无论如何,这与范围无关。如果要将函数参数化为另一个函数,那么将事物作为参数传递是有意义的 - 实质上使它成为高阶函数。一个很好的例子是fold(也称为reduce) - 但map也是一个。

在你的情况下,alterData函数并没有增加太多价值。 map ping某事物是如此常见,通常只提供单元素功能更好,因为它从根本上更可重复使用。

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

答案 1 :(得分:1)

函数式编程与这方面的程序没有区别 - 您编写的定义可以在范围内的任何位置重用。您可以使用各种机制控制范围内的内容,例如模块定义,模块导出列表和模块导入。例如(在Haskell中):

module My.Module
  -- List of definitions exported from this module 
  ( doThing
  , alterData
  ) where

-- Any definitions exported from `My.Other.Module` will be in scope 
-- in this one
import My.Other.Module

-- Can't name this `data` because it's a reserved word in Haskell
yourData :: [String]
yourData = ["cat", "dog", "bird"]

doThing :: String -> String
doThing val = val ++ ", go away!" 

alterData :: [String] -> [String]
alterData strings = map doThings strings

答案 2 :(得分:0)

没有问题variable = (arg0 + arg1 == arg2 ? 0x1 : 0x0) & 0xff; 。 你需要这样做:

doThing