datatype StringList = CONS of string * (unit -> StringList) | NIL fun filter p NIL = NIL | filter p (CONS (x,xf)) = if p x then CONS (x, fn() => filter p (xf())) else filter p (xf()) fun concat (xq, 0) = "" | concat (NIL, n) = "" | concat (CONS (x,xf), n) = x ^ concat (xf(),n-1) fun binString 0 = "" | binString x = binString(x div 2)^(Int.toString (x mod 2)) val bin = let fun genBin 0 = NIL | genBin x = CONS(binString x, fn() => genBin(x+1)) in CONS("", fn() => genBin(0)) end fun main () = let val filteredBin = bin in print (concat(bin, 10)) end