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っぽくてイヤだし)