Как некоторые языки программирования различают функцию и указатель на функцию? - PullRequest
3 голосов
/ 24 августа 2011

Я говорю в основном о функциональных языках программирования. Например, статья в Википедии для map имеет этот пример на языке Haskell-ish:

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

Откуда парсер / компилятор узнает, что мы хотим передать функцию square в map как функцию более высокого порядка, а не пытаться вызывать саму функцию? Для языков со статической типизацией выражение square [1,2,3,4,5], очевидно, не будет компилироваться, но будет ли компилятор действительно использовать это, чтобы определить, что это не то, что я имел в виду?

Или это просто плохой пример из Википедии, и лучший пример может выглядеть как map &square [1,2,3,4,5] (с использованием ссылок на функции в стиле C)?

Ответы [ 3 ]

5 голосов
/ 24 августа 2011

Прежде всего применение функции имеет наивысший приоритет.поэтому, когда синтаксический анализатор встречает «карту», ​​в качестве первого аргумента он будет принимать первое, что справа от него.Тип карты ожидает функцию в качестве первого аргумента, а «квадрат» определяется как функция, поэтому типы являются совместимыми.Вы можете думать о квадрате карты как о функции, которая ожидает список чисел.

Ключ должен проверять типы и проверять типы аргументов, следуя правилам приоритета.

4 голосов
/ 24 августа 2011

Это просто вопрос синтаксического анализа: приложение функции в Haskell является левоассоциативным, поэтому map square [1, 2, 3, 4, 5] анализируется как ((map square) [1, 2, 3, 4, 5]), а не (map (square [1, 2, 3, 4, 5])).

0 голосов
/ 24 августа 2011

Зависит от языка.

Например, в Javascript вы можете ссылаться на функцию f, просто не ставя после нее скобки.

Здесь f рассматривается как указатель на функцию.

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

Здесь это рассматривается как вызов функции:

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

В Scala правила немного более сложны, и у компилятора есть некоторая свобода в «угадывании», вызываете ли вы функцию или ссылаетесь на функцию. См. Какое правило для круглых скобок при вызове метода Scala? для более подробного объяснения.

...