声明类型的方法, 可以声明一个?类型:
public type List<T> = ?(T, List<T>);
创建一个空List :
public func nil<T>() : List<T> = null;
使用 :
private var nilList = List.nil<Nat>();
private var nilList : List.List<Nat> = List.nil<Nat>();
判断一个List是否为空:
使用 :
var isNil = List.isNil(list_name);
public func isNil<T>(l : List<T>) : Bool {
switch l {
case null { true };
case _ { false };
}
};
switch判断,null即空,非null就返回非空false
通过放入一个值得方式创建一个List: push
使用
var list = List.push<Nat>(nat, list);
public func push<T>(x : T, l : List<T>) : List<T> = ?(x, l);
没懂这种函数的写法<<<<<<<<<
得到list的最后一个元素 : 返回一个?T类型
用法 :
var nat = List.last<Nat>(list_name);
public func last<T>(l : List<T>) : ?T {
switch l {
case nfull { null };
case (?(x,null)) { ?x };
case (?(_,t)) { last<T>(t) };
}
};
//源码解读
last方法通过递归的方式进行循环往复地求最后一个元素。
判断方法为,如果无元素,就返回null;
如果有元素: 如果是?(x,null)类型,表示已经到了最后,就返回?x
如果有元素,且有下个元素,表示没到最后,就继续地柜
case(?(_, t) 表示在有下一个元素的情况下,不管本值为任意值,继续向下递归
//猜想
递归,每次递归的时候,返回的都是一个?(x, nextList) , x是当前列表的头元素,nextlist是下一个列表的指针。
每个列表的指针指向的为
?{
element <T>
nextList List.List<T>
}
即每一个列表的名字就是这个列表当前的元素和下一个?(元素)的结构体的指针。
//感悟 : 每个库的方法调用时都要加上 来表示返回的类型,否则库不知道返回什么类型。