高阶函数的命名约定?[关闭]


15

高阶函数有命名约定吗?即,返回其他功能的功能。

Javascript中的示例:

function onlyDivisibleBy(div) { // <-- higher order function
  return function (n) {
    return n % div === 0;
  }
}

var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9]
arr.filter(onlyDivisibleBy(5)); // [0, 5]

我倾向于按照上面的方式编写它:也就是说,在调用点进行了易读性优化(我读了上面的最后几行,即“过滤数组以使项只能被5整除”),但是在定义点从使用它的上下文来看,从其名称了解该函数的作用并不容易。


4
令人惊讶的是,我一直将术语“高阶函数”理解为表示接受另一个函数作为参数的函数。我并不是说您错了,我只是发现我们的理解上的差异很有趣。
拉切特

6
返回函数的@Racheet函数也是高阶的。他们可能两者都做。
itsbruce

3
@Racheet是个好点,并且与本示例非常相关:OP真正实现的是部分应用程序。可以将返回函数的许多(全部?不确定)用法看作部分应用程序。@ nickf: 这是实现示例的一种更干净的方法

Answers:


14

不,我认为您不需要特殊的命名约定来表明您要返回一个函数。我们可以从那里功能的语言看到令行禁止,返回功能基本相同,具有多个参数的函数。例如onlyDivisibleBy(3)(6)和之间几乎没有区别onlyDivisibleBy(3,6)

我将名称从更改为onlyDivisibleByisDivisibleBy因为我认为这is是表示谓词的更常见的方式,并且由于6显然也可以被2整除,因此 onlyDivisibleBy(3)(6)似乎无法返回。true


5

在强类型的函数语言中,从函数签名中可以明显看出什么是高阶函数,什么不是,因此根本没有必要。

在其他语言中,我从来没有遇到过这样的命名约定,我想不出这样的命名约定不会很麻烦。我认为,更好地专注于命名功能比重载这样的名称更好。


4

不,您不应该使用任何东西。

为什么?

因为那将是匈牙利的一种表示法。想法是,传递给高阶函数的函数只是一种变量。所以那样对待他们。


1
意味着要不惜一切代价避免使用匈牙利符号吗?我建议阅读“ 使代码看起来不正确”
TehShrike 2013年

4
我以前读过这篇文章,但我仍然相信匈牙利文法是不好的:)
Wilbert

@TehShrike您的链接已断开。
corvus_192

1
@ corvus_192必须在Joel的博客重新设计中迷路了!新网址似乎是joelonsoftware.com/2005/05/11/making-wrong-code-look-wrong
TehShrike
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.