Type requirement
本节标题的含义是:描述对类型的期望(expectation)或要求(requirement)。在各种programming paradigm,尤其是generic programming,都涉及这个topic,本文对此进行总结。
Specification of type requirement: ***able
在阅读
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
C++ named requirements: Callable
2、iterable
Python iterable
C++?
3、awaitable
Python Awaitables¶
Java ?
4、comparable
Python object.__lt__
(self, other)¶
Java Interface Comparable
C++ overload operator
See more
1、C++ cppreference C++ Named requirements
2、Python able
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。