Rascal:函数是否可以返回函数

时间:2020-02-12 20:29:46

标签: higher-order-functions rascal

Rascal文档有一个example of a function,该函数将函数作为参数:

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

相反,返回函数的函数的语法是什么?

我找不到示例并尝试了以下方法:

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

但在副本中出现语法错误。

2 个答案:

答案 0 :(得分:2)

这里是一个例子:

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 :(得分:1)

我失败尝试的简短答案是:

  • 省略返回类型为server { listen 80; server_name 68.183.203.33 yahkut.com www.yahkut.com; return 301 https://$server_name$request_uri; # Stop here, it's will be redirect to HTTPS. There's no left to execute } server { listen 443 ssl; server_name yahkut.com www.yahkut.com; ssl_certificate /path/to/certificate/your_domain_chain.crt; ssl_certificate_key /path/to/your_private.key; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/leptitoxadmin/pyapps/Leptitox; } location /media/ { root /home/leptitoxadmin/pyapps/Leptitox; } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } } 的最外面的括号
  • 添加f返回的匿名函数的返回类型int
  • 别忘了f的{​​{1}}语句后的半音

给出:

f