类型可以从两个角度去理解,
1. 在编程语言里,类型保证了在表达式和函数里怎么保证程序的正确.
比如:在应用 add时,保证参数是 int, 在concat里是 string;
2. 对数据的定义,我们如何表示一个数据是什么,如何去解析,去使用它,
比如说,数据库里person类型里定义,(person.name,person.age);
让我们来归纳一下,在应用中我们常见类型,(不太严格的方式,使用类haskell的语法)
.
基本类型,
bool, int, string
.复合类型
..
组合 struct/tuple,
example: person: (age:int, name:string)
..
枚举 (union+enum):
example:
week: (mon | tus | wen | thu | fri | sat | sun)
input: (mouse: x:int, y:int) | (key: keycode:int)
(tips: 这里我们怎么表示
1. array int[3], arr3 := (int, int, int)
2. list<int>, list_int := (int: value, next: list_int) | end
3. binary_tree: left: (value:int, left:binary_tree, right:binary_tree) | leaf : int
可见,到这里,我们已经可以表达一般的
数据结构.
.
函数类型 type_1->type_2
example:
(定义了内置的一些函数)
length : string->int
..
高阶函数类型 type_1->(type_2->type_1)
example:
encode: (code_method:int->(src:string->dst:string) )
(很多编程语言里的闭包)
..(如果我们加上(表达式/apply
, 函数求值)
,就是一个编程语言了)
..
模板 Type <type_args> := <type expression>
example:
list T := (value: T, next: list T) | null
(像是c++里的 list<T> )
谈谈类型的关系,子类型如何表示在这个系统里呢,class Derived : base
组合和继承是同态的,继承可以认为是组合的一个语法糖,因此它也包括在 struct 类型关系里,
但显然,类型转换这样的语法糖是很方便的.
实用上,应该提供原生的,array<T>, option<T>, (in proto_buffer) .
更强的类型系统,是
depend type, 当然已经超过我能讨论的了.