Skip to content

Type requirement

本节标题的含义是:描述对类型的期望(expectation)或要求(requirement)。在各种programming paradigm,尤其是generic programming,都涉及这个topic,本文对此进行总结。

Specification of type requirement: ***able

在阅读

1、Python doc

2、cppreference

3、Java doc

时,会发现它们都使用"***able"来描述对type的期望/要求。在一门语言的language reference中需要详细地说明当对某种type的对象(object)进行操作的时候(比如某个标准库的函数),期望/要求 它(object) 具备/满足 某些条件(这就是**type requirement**,因为C++、Python都是strong typed language),因此明确地定义这些**type requirement**,能够使对语言的表述非常便利,清晰,易懂。这些type requirement其实非常能够体现一门语言的核心特性。

***able example

上述语言的normative text of standard中,都使用"***able"来描述对type的期望/要求,比如:

1、callable

Python Callable types

Java Interface Callable<V>

C++ named requirements: Callable

2、iterable

Python iterable

Java Interface Iterable<T>

C++?

3、awaitable

Python Awaitables

Java ?

C++ Coroutines (C++20)

4、comparable

Python object.__lt__(self, other)

Java Interface Comparable

C++ overload operator

See more

1、C++ cppreference C++ Named requirements

2、Python able

iterable

asynchronous iterable

awaitable

hashable

immutable

mutable

executable

callable

C++通过named requirement来定义这些特性,Python中也有类似的概念,但是貌似python并没有像C++这样进行显式地定义。

Summary

通过上面的分析,我们已经知道Python able、C++ named requirement、Java generics本质上是相同的东西: specification of type requirement。

Ability

1、"ability"的含义是"能力,能耐;才能"

2、满足"***able"等价于具备***ability

3、在Assemble-ability中,就运用了这个说法

Type requirement is more about behavior-based

本节标题的意思是: type requirement往往是**behavior-based**。在Theory\Programming-paradigm\Abstraction-and-polymorphism\Polymorphism\Implementation中,提出了"Polymorphism is more about behavior-based",本节标题的含义与此类似;这是我的经验之谈,主要源于:

1、Python、C++、Java都是让user-defined class通过实现**magic function**来为这个**类型**添加某种**特性**/behavior,从而使它满足type requirement,所以在学习时,需要将**feature**/behavior**和对应的**magic function**关联起来。所谓**magic function,其实就是实现了特定功能的函数,在上层函数中,这个函数会被调用。比如OOP中的virtual function。

2、Java interface、C++ named requirement、Python able,这些应该都将它们放到behavior-based中

Implementation

不同的programming language,不同的programming paradigm,对于specification of type requirement的实现方式是不同的,因此无法进行全面的、统一的描述,下面以programming paradigm分类来进行描述。

Class-based OOP

在class-based OOP语言,类**可以看做是一种**类型。Class-based OOP中具备inheritance、implement(Java)关系的class,往往具备相同的behavior,能够满足相同的type requirement。

参见:

1) wikipedia Protocol (object-oriented programming)

2) wikipedia Interface (Java)

下面是一些example:

1) wikipedia Bounded quantification

interface Comparable<T> {
  public int compareTo(T other);
}

class Integer implements Comparable<Integer> {
  @Override
  public int compareTo(Integer other) {
    //...
  }
}

class String implements Comparable<String> {
  @Override
  public int compareTo(String other) {
    //...
  }
}

class Test {
  public static void main(String[] args) {
    Comparable<String> a = min("cat", "dog");
    Comparable<Integer> b = min(new Integer(10), new Integer(3));
    String str = Fmin("cat", "dog");
    Integer i = Fmin(new Integer(10), new Integer(3));
  }
  public static <S extends Comparable> S min(S a, S b) {
    if (a.compareTo(b) <= 0)
      return a;
    else
      return b;
  }
  public static <T extends Comparable<T>> T Fmin(T a, T b) {
    if (a.compareTo(b) <= 0)
      return a;
    else
      return b;
  }
}

Generic programming(GP)

Generic programming中使用concept来specify type requirement,关于此,参见Theory\Programming-paradigm\Generic-programming

参见: wikipedia Concept (generic programming)

Python duck type

Duck type可以看做是GP的一种实现。

Generics

通过Bounded quantification来实现,参见Theory\Programming-paradigm\Generic-programming\Generics章节。

Design by contact and type requirement

如果从Design by contact的角度来看的话,上面所说的expectation就是一种contact,programmer只有遵循了这个contact才能够正确地使用standard library。