在您的模块中定义此函数:
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(...)
?
因为 Rascal 的类型检查器仍在开发中,所以如果您犯了一个小错误(例如忘记为函数参数提供类型),您不会收到警告。在某些情况下,它可能仍然有效,意外地,但正如你所观察到的,你肯定会在某个地方遇到麻烦。原因是函数参数的类型推断根本没有作为一项功能实现。这是一个语言设计决策,旨在使错误消息易于理解。
所以,这是不允许的:
int f(a) = a + 1;
而且,应该这样写:
int f(int a) = a + 1;
我认为解释器不会抱怨无类型参数是一个错误。这是因为我们对函数参数和内联模式重用了模式匹配代码。 [编辑:问题已注册此处]
在您的情况下,该示例有效,因为动态地值的类型是
int
并且加法不会检查参数类型。这个损坏的示例失败了,因为解释器确实检查了调用站点处函数参数的类型(对于无类型参数,默认为 value
)。