【问题标题】:Naming a function that applies a list of functions to one value命名将函数列表应用于一个值的函数
【发布时间】:2019-05-03 15:59:42
【问题描述】:

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

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

  • 如果一个函数接受 [X] 和 f: X -> Y 并返回一个 [Y},那么它通常称为 map。 (有时是方法,有时是函数,但原理始终相同)
  • 如果函数接受 [X] 和 f: X -> 布尔值并返回 [X],则称为过滤器。
  • 如果函数接受 [X] 和 f: X -> [Y] 并返回 [Y],则称为 flatMap。

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

【问题讨论】:

  • 那不就是 Map-FlatMap 的合成吗?
  • sequence in Haskell 这样做。
  • Clojure 称之为`juxt',是“并置”的缩写。

标签: functional-programming naming


【解决方案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 都很简单,我认为它们直接编码了你的意图。


解决此问题的另一种方法可能是首先解构您的问题。 “命名一个将函数列表应用于一个值的函数” 如果您已经有一个函数需要一个类型的列表并生成一个新类型的列表(@ 987654343@)。这里的独特需求是能够将常量应用于函数,我们看到apply 很容易展示了这一点。

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

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2013-09-30
    • 1970-01-01
    相关资源
    最近更新 更多