pair type: (e1, e2)
typing: t1*t2, t1,t2分别是e1和e2的值
取值:#1, #2
可以nest,但是只能有两项
tuple type:(e1, e2...)
类似pair,本质是record
和record(by name)比,是by position, 顺序是有意义的
语法糖:其实也是{1= e1, 2 = e2},类型t1*t2... 也是 {1:t1, 2:t2...}, #1的意义也是key的意义
record type: {C1=e1, C2=e2...}
typing: {C1:t1, C2:t2...}
each-of type
通过#C1访问
语法糖:对于each-of type(record, tuple)也能使用case expression
只有一个分支的case r of ({C1 = x1, C2 = x2}) =>e
可以进一步
在variable binding里加入pattern matching, 写成let val {C1 = x1, C2 = x2} = r in e end
可以进一步
将pattern写在函数参数中。实际上函数只接收一个参数,只是通过语法糖,将这个参数通过pattern matching取得内容
=>无需提供参数类型信息了,因为已经在pattern中。type checker会根据xi的用法推断出类型,对于没有推断出的类型使用多态类型'a 'b 'c表示
无参函数实际上是对传入的
unit值()进行匹配
list type:[e1, e2...]
typing: 必须类型都是t,表示为t list
[]:空列表,type是任何值的列表,表示为'a list(alpha list)
e1::list: 在列表中加值。1::[] => [1]
null: 检查是否为空
hd: head element of list
tl: tail list of list
option type: None|Some e
typing:None: 'a option; Some e:t
isSome: 是否是Some类型
valOf: 取得e