ATS における線形型のリストは線形リストとも呼ばれ、本質的にはC言語における片方向リストに対応します。 次の線形データ型宣言は、線形リストを表わす線形型 list_vt を導入しています:
// datavtype list_vt(a:vt@ype, int) = | list_vt_nil(a, 0) of () | {n:nat} list_vt_cons(a, n+1) of (a, list_vt(a, n)) //
次の関数 list_vt_length は、読み込みのみ許された線形リストをあつかう典型的な方法を示しています:
// fun {a:vt@ype} list_vt_length (xs: !list_vt(a, n)): int(n) = ( case+ xs of | list_vt_nil() => 0 | list_vt_cons(x, xs2) => 1 + list_vt_length<a> (xs2) ) //
次の関数 list_vt_foreach は、線形リストに保管された要素を変更する典型的な方法を示しています:
// fun {a:vt@ype} list_vt_foreach ( xs: !list_vt(a, n) , fwork: (&(a) >> _) -<cloref1> void ) : void = ( case+ xs of | list_vt_nil() => () | @list_vt_cons(x, xs2) => (fwork(x); list_vt_foreach<a> (xs2, fwork); fold@(xs)) ) //
// fun {a:vt@ype} list_vt_append {m,n:nat} ( xs: list_vt(a, m), ys: list_vt(a, n) ) : list_vt(a, m+n) = let // fun loop{m:nat} ( xs: &list_vt(a, m) >> list_vt(a, m+n), ys: list_vt(a, n) ) : void = ( case+ xs of | ~list_vt_nil() => (xs := ys) | @list_vt_cons(x, xs2) => (loop(xs2, ys); fold@(xs)) ) // in case+ xs of | ~list_vt_nil () => ys | @list_vt_cons (x, xs2) => (loop(xs2, ys); fold@(xs); xs) end // end of [list_vt_append] //
次の関数 list_vt_free は、与えられた非線形の要素を含む線形リストを解放します:
// fun {a:vt@ype} list_vt_free {n:nat} ( xs: list_vt(a?, n) ) : void = ( case+ xs of | ~list_vt_nil() => () | ~list_vt_cons(x, xs2) => list_vt_free<a> (xs2) ) //
この章で紹介したコード全体とテストコードは オンライン から入手できます。