为什么在直接使用函数时参数中缺少显式类型声明有效,但在将其传递给另一个函数时却不起作用?
Why does lacking explicit type declaration in parameter work when function is used directly, but not when it is passed to another function?
在你的模块中定义了这个函数:
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;
我认为解释器没有抱怨未类型化参数是一个错误。这是因为我们为函数参数和内联模式重用了模式匹配代码。 [编辑:问题已在 https://github.com/cwi-swat/rascal/issues/763]
注册
在你的例子中,这个例子是有效的,因为动态地值的类型是int
并且加法不检查参数类型。损坏的示例中断是因为解释器确实在调用站点检查了函数参数的类型(对于未类型化的参数,默认为 value
)。
在你的模块中定义了这个函数:
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;
我认为解释器没有抱怨未类型化参数是一个错误。这是因为我们为函数参数和内联模式重用了模式匹配代码。 [编辑:问题已在 https://github.com/cwi-swat/rascal/issues/763]
注册在你的例子中,这个例子是有效的,因为动态地值的类型是int
并且加法不检查参数类型。损坏的示例中断是因为解释器确实在调用站点检查了函数参数的类型(对于未类型化的参数,默认为 value
)。