结构等价与名称对等

joh*_*ohn 15 type-equivalence

我似乎无法准确掌握什么名称等价.我很确定我的结构已经下降了.我教授给出的一个例子是:

 Type TI=integer
 Type TTI=TI

 a=integer
 b=TTI
 f= ref float
 g= ref float
Run Code Online (Sandbox Code Playgroud)

a和b都是结构和名称等价的,而f和g只是结构上的等价.我不明白为什么a和b是名字等价的,但f和g不是.

Jer*_*yal 36

输入平等

赋值(在C中用=表示)等基本操作的含义在语言定义中指定.因此,例如,语句的含义如

x = y;
Run Code Online (Sandbox Code Playgroud)

这里将object的值y复制到变量的内存位置x.

但是,在转换器可以接受诸如赋值之类的操作之前,通常两个操作数的类型必须相同(或者可能以某种其他指定的方式兼容).

因此,语言翻译者必须在某些情况下决定两种类型是否相等.我们现在考虑说两种类型"相等"(或等价)意味着什么.

有两种标准方法可以确定两种类型是否相同: 名称等价结构等价.

名称等价是最直接的:当且仅当它们具有相同的名称时,两种类型是相等的.因此,例如,在代码中(使用C语法)

   typedef struct {
           int data[100];
           int count;
           } Stack;

   typedef struct {
           int data[100];
           int count;
           } Set;

   Stack x, y;
   Set r, s;
Run Code Online (Sandbox Code Playgroud)

如果在语言中使用名称等价,x并且y它将是相同的类型,r并且s将具有相同的类型,但是类型xy不等于r或的类型s.这意味着如

   x = y;
   r = s;
Run Code Online (Sandbox Code Playgroud)

是有效的,但是如

   x = r;
Run Code Online (Sandbox Code Playgroud)

不会有效(即不会被翻译接受).

使用结构等价:,两种类型是相同的,当且仅当它们具有相同的"结构",它可以以不同的方式来解释.
严格的解释是两种类型的每个组件的名称和类型必须相同,并且必须在类型定义中以相同的顺序列出.
不太严格的要求是组件类型必须在两种类型中相同且顺序相同,但组件的名称可能不同.

再看上面的例子,使用结构等价两种类型Stack并且Set被认为是等价的,这意味着翻译者会接受诸如

x = r;
Run Code Online (Sandbox Code Playgroud)

(注意,C它不支持结构等价,并且会给上面的赋值带来错误.)


Mad*_*ena 5

考虑下面的两个定义。

type student = record
    name, address : string
    age : integer

type school = record
    name, address : string
    age : integer

x : student;
y : school;
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,变量 x 和 y 将被认为在名称等价下具有不同的类型:x 使用在第 1 行声明的类型;y 使用在第 4 行声明的类型。名称等效基于这样一个假设:如果程序员努力编写两个类型定义,那么这些定义可能意味着代表不同的类型。(我不确定你给出的例子)

参考:编程语言语用学,ML Scott


小智 2

a 和 b 是盟友,这就是为什么它们的名称相同。f 和 g 不是,所以它们不是等价的。