一些编程语言如何区分函数和函数指针?

3 pointers functional-programming function map higher-order-functions

我主要谈的是函数式编程语言.例如,维基百科的地图文章以Haskell-ish语言为例:

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

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

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

mar*_*cho 5

首先,功能应用程序具有最高优先级.所以当解析器遇到"map"时,它会将第一个东西作为第一个参数.map类型需要一个函数作为第一个参数,"square"被定义为一个函数,因此类型是兼容的.您可以将map square视为期望数字列表的函数.

关键是检查类型,并根据优先级规则验证参数类型.

  • @ user793587:还要注意,在正常情况下,Haskell中的所有内容大致是对不可变值的引用(或者是生成此类值的暂停计算).因此,您可以将`map`和`square`视为C语义中的​​"引用".结合解析规则(请记住空白表示函数应用程序),这应该使事情变得清晰. (2认同)