在您的模块中定义此功能:
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(...)
?
答案 0 :(得分:1)
由于Rascal的类型检查器仍处于开发阶段,因此如果您忘记为函数参数提供类型,则不会发出警告。它可能仍然有效,意外,在某些情况下,但你可以保证在你观察到的某个地方遇到麻烦。原因是函数参数的类型推断根本不是作为特征实现的。这是一种语言设计决策,旨在使错误消息易于理解。
所以,这是不允许的:
int f(a) = a + 1;
而且,它应该写成这样:
int f(int a) = a + 1;
我认为这是一个错误,解释器不会抱怨无类型的参数。这是因为我们为函数参数和内联模式重用了模式匹配代码。 [编辑:问题已在https://github.com/cwi-swat/rascal/issues/763]
注册在您的情况下,该示例有效,因为动态值的类型为int
,并且添加不检查参数类型。破解的示例会中断,因为解释器会检查调用站点上的函数参数的类型(对于无类型参数,默认为value
。)