SMLのLazyリストプチ改良

以前作ったSMLの遅延リストのコンストラクタを, デフォルトの正格リストに合わせました.
これで組み込み(というかtoplevel)で用意されているリストと同じように使用できると思っていた時期が私にもありましたorz

datatype 'a inflist = nil | ::: of 'a * 'a inflist Lazy.susp;
infix 5 ::: ; (* SMLのコンストラクタは関数なので中置にできる *)
(* それっぽい連結も定義 *)
fun lappend nil      ys = ys
  | lappend (x:::xs) ys = x:::Lazy.delay (fn ()=>lappend (Lazy.force xs) ys);
fun op++ (xs,ys) = lappend xs ys;
infix 5 ++;

使ってみる

- val xs = 1:::Lazy.delay (fn()=>2:::Lazy.delay(fn()=>nil));
val xs = 1 ::: - : int inflist
- val ys = 5:::Lazy.delay (fn()=>6:::Lazy.delay(fn()=>nil));
val ys = 5 ::: - : int inflist
-ltake 4 (xs ++ ys);
val it = [1,2,5,6] : int list

えーと(^^;;;
デフォルト正格なのでどうしてもその場でサンクを作らないとダメみたいで…,
もう私にはどうしようもないです.
強いて挙げればLazyリストを引数に取る時に,パターンマッチが多少見やすくなるところが利点でしょうか.(consとかlispっぽくてイヤだし)

当然ですが,

これやってもvimのsyntax highlightがうまく色付けてくれません.
matchの件といいSMLのsyntax fileはOCamlのついでにくっついてるって雰囲気ですね.
まともな規格があるのはSMLの方なのに…. って私は規格読んでませんが(^^;;

Cleanと比べると

連結する記号(op::)自体がコンストラクタなのが面白いですね.
Cleanではリストのコンストラクタは''です.
これはユーザが上書きしたり,似たような別の記号を追加したり(多分)出来ないんですが,型クラスやGenericsの指定で使います.
(:)は単なる2項演算子として定義されています.
SMLの'
'記号は完全にユーザの手の届かないところにあるっぽいので残念ですね.