为什么参数中缺少显式类型声明在直接使用函数时有效,但在传递给另一个函数时却无效?

问题描述 投票:0回答:1

在您的模块中定义此函数:

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
1个回答
1
投票

因为 Rascal 的类型检查器仍在开发中,所以如果您犯了一个小错误(例如忘记为函数参数提供类型),您不会收到警告。在某些情况下,它可能仍然有效,意外地,但正如你所观察到的,你肯定会在某个地方遇到麻烦。原因是函数参数的类型推断根本没有作为一项功能实现。这是一个语言设计决策,旨在使错误消息易于理解。

所以,这是不允许的:

int f(a) = a + 1;

而且,应该这样写:

int f(int a) = a + 1;

我认为解释器不会抱怨无类型参数是一个错误。这是因为我们对函数参数和内联模式重用了模式匹配代码。 [编辑:问题已注册此处]

在您的情况下,该示例有效,因为动态地值的类型是

int
并且加法不会检查参数类型。这个损坏的示例失败了,因为解释器确实检查了调用站点处函数参数的类型(对于无类型参数,默认为
value
)。

© www.soinside.com 2019 - 2024. All rights reserved.