データ観型 (dataviewtype) はデータ型の線形バージョンとして考えることができます。 おおざっぱに言うと、データ観型はデータ型とデータ観との組み合わせです。 このプログラミングの機能は手動でメモリ管理をする状況下でパターンマッチのような利便性を提供することを主な目的として ATS に導入されています。 GC を削減したり完全に除去しなければならない状況下では、データ観型はしばしばデータ型を置き換えることになります。 この章ではいくつかの一般的に用いられるデータ観型とその使い方を紹介します。
オプショナル値が生成さると、その値はたいがいすぐに使われて破棄されます。 そのような値に線形型が割り当てられているなら、値を保管するために確保されたメモリを効率よく回収することができます。 線形オプショナル値を表わすデータ観型 option_vt は次のように宣言されます:
// datavtype option_vt (a:t@ype+, bool) = | Some_vt (a, true) of a | None_vt (a, false) of () // end of [option_vt] // vtypedef Option_vt (a:t@ype) = [b:bool] option_vt(a, b) //
fun{a:t@ype} find_rightmost {n:nat} .<n>. ( xs: list (a, n), P: (a) -<cloref1> bool ) : Option_vt (a) = ( case+ xs of | list_cons (x, xs) => let val opt = find_rightmost (xs, P) in case opt of | ~None_vt () => if P (x) then Some_vt (x) else None_vt () | _ (*Some_vt*) => opt end // end of [list_cons] | list_nil () => None_vt () ) (* end of [find_rightmost] *)
別の例として、次の関数テンプレート list_optcons は与えられたオプショナル値を展開した要素を先頭にした新しいリストをコンストラクトします:
記号 bool2int は true と false をそれぞれ 1 と 0 に変換する ATS におけるビルトインの静的な関数です。 ここで注目すべきなのは、list_optcons の最初の引数が線形であり、list_optcons 呼び出しが返ると消費され、それが占有していたメモリは回収されるということです。