Rascal: может ли функция вернуть функцию - PullRequest
1 голос
/ 12 февраля 2020

Документация Rascal содержит пример функции , которая принимает функцию в качестве аргумента:

int f(int x, int (int) multi){ return multi(x); }

И наоборот, каков синтаксис функции, возвращающей функцию?

Я не смог найти пример и попробовал что-то вроде:

(int (int)) f() {return (int y) {return y;}}

, но получил синтаксические ошибки в ответе.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Вот пример:

int two(int n) = 2 * n;
int(int) g() = two;

Функция two умножается на 2 и g возвращает функцию two. Обратите внимание, что типом возврата g является int(int), тип, описывающий функцию, которая возвращает int и имеет один аргумент int.

Аналогичного эффекта можно достичь с помощью встроенного определения:

int(int) g() = int(int n) { return 2 * n; };

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

int mult(int n, int m) = n * m;

Если вы используете ее, вы получите то, что ожидаете:

rascal>mult(3,4);
int: 12

Вместо этого вы можете вернуть функцию которая по существу частично применяет эту функцию следующим образом:

int(int) multBy(int n) { 
    return int(int m) { 
        return mult(n,m); 
    }; 
}
int (int) (int)

Итак, это возвращает функцию, которая принимает int и возвращает int (int), то есть функцию, которая принимает int и возвращает int. Затем вы можете использовать его следующим образом:

rascal>multBy3 = multBy(3);
int (int)

rascal>multBy3(4);
int: 12

В некоторых наших (многих) файлах с тестами вы можете найти больше примеров:

  • lang::rascal::tests::basic::Functions
  • lang::rascal::tests::functionality::FunctionComposition

Спасибо за ваш вопрос, у нас есть больше документации, чтобы сделать!

1 голос
/ 13 февраля 2020

Короткий ответ на мою неудачную попытку:

  • пропустите крайние парни в типе возврата f
  • добавьте тип возврата int анонимного функция, возвращаемая f
  • , не забывайте полупериод после оператора f return

, который дает:

int (int) f() { return int (int y) { return y; } ; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...