1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
datatype 'a parList =
NIL
| CONS of 'a * index
fun listInitialize cell L =
case L of
nil => cell NIL
| h :: tail =>
let
val tailIndex = listInitialize cell tail
in
cell (CONS(h, tailIndex))
end
fun listInitialize (K: index -> index) cell L =
case L of
nil => K (cell NIL)
| h :: tail =>
let
val newK = fn i => K (cell (CONS(h, i)))
in
listInitialize newK cell tail
end
fun listFinalize value =
let
fun conv i =
case value i of
NIL => nil
| CONS(head, tail) => head :: conv tail
in
conv
end
val whereParam =
{size = fn L => List.length L + 1,
initialize = fn x => listInitialize (fn (x:index) => x) x,
default = NIL,
finalize = listFinalize}
fun mapList f L =
_foreach id in L where whereParam
with {value, newValue, size}
do case value id of
NIL => NIL
| CONS(head, tail) => CONS(f head, tail)
while false
end
|