你把类型放在 Chapel 变量声明的什么地方?

Where do you put the type in Chapel variable declarations?

你把类型放在 Chapel 变量声明的什么地方?

更具体地说,var a = 42: int;var a: int = 42;有什么区别?

这个问题的三个基本背景事实:

  1. Chapel 的变量声明语法是:var ident: type = 初始化;

  2. Chapel 支持 compile-time 类型推断

  3. 在礼拜堂,:有两个角色:

    • 作为声明新符号时的类型说明符或约束
    • 应用于表达式时作为转换运算符

鉴于此,声明:

var a: int = 42;

表示“声明一个名为 a 的变量,其类型为 int,其初始值为 42。”然而,

var a = 42: int;

表示“声明一个名为 a 的变量,其类型(因为未指定)将从其初始值设定项中推断出来,即值 42 转换为 int。”

现在,在 Chapel 中,42 默认被解释为 int,所以这个最终声明实际上与:

没有什么不同
var a = 42;

以上所有三个声明具有相同的净效果。

当你混合不同的类型时,事情会变得稍微有趣一些。例如:

var b: int(8) = 42;

表示 b 应该是一个初始值为 42 的 8 位整数。在 Chapel 中,即使 42 的推断类型是 int(这是一个 64 位整数) ,因为它是一个可以用少于 8 位表示的文字值,编译器会自动将它向下转型以适应 int(8)。

或者,可以使用以下形式明确表示向下转换:

var b = 42: int(8);  // downcast to int(8) and infer the type

但请考虑:

var c: int(8) = a;

这将是一个错误,因为 a 是一个默认的 int 变量(64 位)并且 Chapel 不支持从更宽的 int 表示变量到更窄的 int 表示的变量的隐式向下转换。所以在这种情况下,您需要将此声明写成以下两种形式之一:

var c = a: int(8);          // explicitly downcast and infer the type
var c: int(8) = a: int(8);  // give an explicit type and also explicitly downcast to make the initializer compatible

不用说,由于第二种形式有点迂腐,我们倾向于选择前者。