为什么在直接使用函数时缺少参数中的显式类型声明,而不是在传递给另一个函数时?

时间:2015-01-28 11:14:09

标签: rascal

在您的模块中定义此功能:

module Data

int inc(x) = x + 1;

在控制台中输入:

rascal> import Data;
rascal> import List;

这有效:

rascal> inc(1);
int: 2

但这不是:

rascal> list[int] y = [1,2,3];
rascal> mapper(y, inc); 
|rascal://<path>|: insert into collection not supported on value and int
☞ Advice

但如果声明了inc(...)的参数类型,它就可以工作:

int inc(int x) = x + 1;

那么为什么没有这种类型声明直接使用inc(...)函数,而不是将该函数传递给mapper(...)

1 个答案:

答案 0 :(得分:1)

由于Rascal的类型检查器仍处于开发阶段,因此如果您忘记为函数参数提供类型,则不会发出警告。它可能仍然有效,意外,在某些情况下,但你可以保证在你观察到的某个地方遇到麻烦。原因是函数参数的类型推断根本不是作为特征实现的。这是一种语言设计决策,旨在使错误消息易于理解。

所以,这是不允许的:

int f(a) = a + 1;

而且,它应该写成这样:

int f(int a) = a + 1;

我认为这是一个错误,解释器不会抱怨无类型的参数。这是因为我们为函数参数和内联模式重用了模式匹配代码。 [编辑:问题已在https://github.com/cwi-swat/rascal/issues/763]

注册

在您的情况下,该示例有效,因为动态值的类型为int,并且添加不检查参数类型。破解的示例会中断,因为解释器会检查调用站点上的函数参数的类型(对于无类型参数,默认为value。)