functional-programming - 命名将函数列表应用于一个值的函数
问题描述
但是如何调用一个接受 [X -> Y] 和 X 并返回 [Y] 的函数?即一个函数,它接受一个函数列表和一个值,并在列表中的所有函数都应用于给定参数时返回一个结果列表。
大多数常见的简单高阶函数在大多数编程语言中都有一致的简单名称:
- 如果一个函数接受 [X] 和 f: X -> Y 并返回一个 [Y},那么它通常称为 map。(有时是方法,有时是函数,但原理始终相同)
- 如果一个函数接受一个 [X] 和 af: X -> boolean 并返回一个 [X] 它被称为过滤器。
- 如果一个函数接受一个 [X] 和 af: X -> [Y] 并返回一个 [Y],它被称为 flatMap。
请注意,用任何支持函数式编程的语言来实现它当然是微不足道的,这不是我的问题。我的问题是关于命名。我还没有找到任何内置的语言,所以我无法从任何地方复制这个名字。但感觉这是一个如此基本的东西,应该有一个全球理解的名字。
解决方案
函数也有类型。type 的函数与 typea -> b
的函数具有不同的类型a -> c
。
所以,你有一个函数x -> y
。出于概念上的考虑,我们称其为 type z
。你有一个这些z
-type 函数的列表,但是你想要一个y
, 所以你需要的列表[z] -> [y]
——这正是map
它所做的。
如果我们扩展z
回我们的原始类型 ,x -> y
我们可以看到我们试图创建的函数的最终类型:[x -> y] -> [y]
。剩下的就是从x -> y
到y
。让我们看看apply
——</p>
// apply : a -> (a -> b) -> b
const apply = x => f =>
f (x)
如果我们给出apply
一个参数,它会给我们一个你正在寻找的确切类型的函数——</p>
apply (2) // : (Number -> b) -> b
apply ("hello") // : (String -> b) -> b
结合起来map
,apply
我们就得到了我们的结果——</p>
// apply : a -> (a -> b) -> b
const apply = x => f =>
f (x)
// mult : Number -> Number -> Number
const mult = x => y =>
x * y
// listOfFuncs : [ Number -> Number ]
const listOfFuncs =
[ mult (1) // : Number -> Number
, mult (2) // : Number -> Number
, mult (3) // : Number -> Number
, mult (4) // : Number -> Number
]
console .log
( listOfFuncs .map (apply (2)) // [ 2, 4, 6, 8 ] : [ Number ]
, listOfFuncs .map (apply (10)) // [ 10, 20, 30, 40 ] : [ Number ]
)
我从未见过为这种特定的功能组合赋予一个独特的名称,但我认为它也不需要一个。map
并且apply
都很简单,我认为它们直接编码了您的意图。
解决此问题的另一种方法可能是首先解构您的问题。如果您已经有一个函数采用一种类型的列表并生成新类型的列表( ) ,那么“命名一个将函数列表应用于一个值的函数”map
是一种夸大的需求。这里的独特需求是能够将常量应用于函数,我们看到很容易用apply
.
简单程序的组合效果是函数式编程强大的原因。编写一个做太多事情的程序会降低它的可重用性。努力命名一个函数可能表明你犯了一个错误。
推荐阅读
- gps - LoRaWan - 可以追踪运动员吗?
- java - Xalan-J:在扩展函数中解析 QName 文本值的命名空间
- javascript - 反应 {...props} 副作用
- laravel - Laravel PostgreSQL:SELECT DISTINCT ON 表达式必须匹配初始 ORDER BY 表达式
- javascript - 为什么当我使用数组原型创建对象时我得到一个对象
- ruby-on-rails - 升级后无法在 macOS 上安装 PG
- php - 将多维数组转化为关联多维数组
- python - 使用 impyla 在 impala 中计算统计信息
- node.js - NodeJS Express 休息调用
- excel - 需要 Excel 宏中的函数来实时流式传输股票价格