命名将一个函数列表应用于一个值的函数

时间:2018-12-01 22:04:00

标签: functional-programming naming

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

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

  • 如果函数采用[X]和f:X-> Y并返回[Y},则通常称为map。 (有时是方法,有时是函数,但原理总是相同的)
  • 如果函数采用[X]和f:X->布尔值并返回[X],则称为过滤器。
  • 如果函数采用[X]和f:X-> [Y]并给出backa [Y],则称为flatMap。

请注意,以任何支持函数式编程的语言来实现它当然都是微不足道的,这不是我的问题。我的问题是关于命名。我没有找到任何内置此语言的语言,因此无法从任何地方复制该名称。但是感觉这是一件很基本的事情,应该有一个全球公认的名称。

1 个答案:

答案 0 :(得分:1)

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

因此,您有一个函数x -> y。为了概念上的考虑,我们将其称为z。并且您具有这些z类型的函数的列表,但是您想要y的列表,因此需要[z] -> [y] –这正是map的作用。

如果我们将z扩展回原来的类型x -> y,则可以看到我们要制作的函数的最终类型:[x -> y] -> [y]。剩下的就是从x -> yy。让我们看看apply

// apply : a -> (a -> b) -> b
const apply = x => f =>
  f (x)

如果我们给apply一个参数,它将给我们返回您要查找的确切类型的函数–

apply (2)        // : (Number -> b) -> b
apply ("hello")  // : (String -> b) -> b

mapapply结合在一起就可以实现结果–

// 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 ]
  )

我从未见过这种特殊功能组合的唯一名称,但我也不认为它也需要一个。 mapapply都很简单,我认为它们可以直接编码您的意图。


解决此问题的另一种方法可能是先解构您的问题。如果您已经有一个采用一种类型的列表并产生一个新类型的列表的功能,则“命名一个将一个函数列表应用于一个值的函数” 是一种夸大的要求。 {1}})。这里唯一需要的是将常数应用于函数的能力,我们很容易用map看到它。

简单程序的组合效果使函数式编程功能强大。编写执行太多任务的程序会使它的可重用性降低。命名函数的努力可能表明您犯错了。