Nominative和Structural类型系统

April 10, 2013

Nominative类型系统

在Nominative类型系统中,根据类型的名字(或声明)来判断类型等价,所以又叫name-based type system(基于名字的类型系统)。

class ClassA {
        int a;
}

class ClassB {
       int a;
}

ClassA objA = new ClassA();
ClassB objB = new ClassB();

上面的例子中,objAobjB虽然有相同的结构,但是被声明为不同的类型,所以objAobjB不能互换。

子类型也一样,要通过显式声明来表明一个类型是另一个类型的子类。

Structural类型系统

结构类型系统中,通过对象的结构来判断等价和子类关系,对象的结构也就是一些属性和方法,只要两个对象有相同的字段,它们的类型就是等价的。对象A包含对象B的属性,那么对象A就是对象B的子类(子类对父类进行扩展,可增加属性)。

我接触过的,也就只有Go的interface了。

Duck typing和结构类型不同,Duck typeing是在运行时进行检测。Duck typing也是一种结构类型,运行时检测也不是必须的

Vinly

Vinly在Haskell里实现了结构类型,以后继续。

参考

  1. Nominative type system
  2. Structural type system
  3. Vinyl: Modern records for haskell
  4. Reddit上关于Vinly的讨论