首页 > 解决方案 > 命名将函数列表应用于一个值的函数

问题描述

但是如何调用一个接受 [X -> Y] 和 X 并返回 [Y] 的函数?即一个函数,它接受一个函数列表和一个值,并在列表中的所有函数都应用于给定参数时返回一个结果列表。

大多数常见的简单高阶函数在大多数编程语言中都有一致的简单名称:

请注意,用任何支持函数式编程的语言来实现它当然是微不足道的,这不是我的问题。我的问题是关于命名。我还没有找到任何内置的语言,所以我无法从任何地方复制这个名字。但感觉这是一个如此基本的东西,应该有一个全球理解的名字。

标签: functional-programmingnaming

解决方案


函数也有类型。type 的函数与 typea -> b的函数具有不同的类型a -> c

所以,你有一个函数x -> y。出于概念上的考虑,我们称其为 type z。你有一个这些z-type 函数的列表,但是你想要一个y, 所以你需要的列表[z] -> [y]——这正是map它所做的。

如果我们扩展z回我们的原始类型 ,x -> y我们可以看到我们试图创建的函数的最终类型:[x -> y] -> [y]。剩下的就是从x -> yy。让我们看看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

结合起来mapapply我们就得到了我们的结果——</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.

简单程序的组合效果是函数式编程强大的原因。编写一个做太多事情的程序会降低它的可重用性。努力命名一个函数可能表明你犯了一个错误。


推荐阅读