使用在函数范围之外声明的函数是否违反了函数原则,如immutability?或者这是指数组,字符串等数据。
例如:
var data ["cat", "dog", "bird"];
function doThing (val) {
return val + ", go away!"
}
function alterData (data) {
return data.map(doThing);
}
alterData(data);
上述代码是否可以接受?或者“doThing”函数是否需要作为参数传递给alterData函数?
我感到困惑的原因是因为在函数式编程示例中,我经常看到正在使用的语言的本机函数,而不是首先传递给函数。但是,这些示例从未足够复杂,无法显示如何使用函数库。
此致
答案 0 :(得分:1)
依靠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