3

我主要谈论的是函数式编程语言。例如,关于map的 wikipedia 文章有这个用 Haskell 语言编写的示例:

map square [1,2,3,4,5]

解析器/编译器如何知道我们想要将函数作为高阶函数传递,而不是试图调用函数本身squaremap对于具有静态类型的语言,表达式square [1,2,3,4,5]显然不会编译,但编译器真的会使用它来确定这不是我的意思吗?

或者,这只是 Wikipedia 中的一个坏例子,而一个更好的例子可能看起来像map &square [1,2,3,4,5](使用 C 风格的函数引用)?

4

3 回答 3

5

首先,函数应用程序具有最高优先级。因此,当解析器遇到“map”时,它将把右边的第一件事作为第一个参数。map 类型需要一个函数作为第一个参数,并且“square”被定义为一个函数,因此类型是兼容的。您可以将 map square 视为一个期望数字列表的函数。

关键是检查类型,并验证参数类型,遵循优先规则。

于 2011-08-24T03:53:20.750 回答
4

这只是解析的问题:Haskell 中的函数应用程序是左关联的,因此map square [1, 2, 3, 4, 5]被解析为((map square) [1, 2, 3, 4, 5])而不是(map (square [1, 2, 3, 4, 5])).

于 2011-08-24T03:46:23.030 回答
0

这取决于语言。

例如,在 Javascript 中,您可以f通过在函数后面不加括号来引用函数。

这里, f 被视为函数指针。

map(f, [1,2,3,4,5]);

在这里,它被视为函数调用:

f([1,2,3,4,5]);

在 Scala 中,规则要复杂得多,编译器在“猜测”你是否调用或引用函数方面有一些余地。请参阅Scala 方法调用中括号的规则是什么?以获得更详细的解释。

于 2011-08-24T03:43:24.107 回答