81 exception UnequalLengths |
81 exception UnequalLengths |
82 val cons: 'a -> 'a list -> 'a list |
82 val cons: 'a -> 'a list -> 'a list |
83 val single: 'a -> 'a list |
83 val single: 'a -> 'a list |
84 val append: 'a list -> 'a list -> 'a list |
84 val append: 'a list -> 'a list -> 'a list |
85 val apply: ('a -> 'a) list -> 'a -> 'a |
85 val apply: ('a -> 'a) list -> 'a -> 'a |
86 val foldr1: ('a * 'a -> 'a) -> 'a list -> 'a |
|
87 val fold: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b |
86 val fold: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b |
88 val fold_rev: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b |
87 val fold_rev: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b |
89 val foldl_map: ('a * 'b -> 'a * 'c) -> 'a * 'b list -> 'a * 'c list |
88 val foldl_map: ('a * 'b -> 'a * 'c) -> 'a * 'b list -> 'a * 'c list |
|
89 val foldr1: ('a * 'a -> 'a) -> 'a list -> 'a |
90 val foldln: ('a * int -> 'b -> 'b) -> 'a list -> 'b -> 'b |
90 val foldln: ('a * int -> 'b -> 'b) -> 'a list -> 'b -> 'b |
91 val unflat: 'a list list -> 'b list -> 'b list list |
91 val unflat: 'a list list -> 'b list -> 'b list list |
92 val splitAt: int * 'a list -> 'a list * 'a list |
92 val splitAt: int * 'a list -> 'a list * 'a list |
93 val dropwhile: ('a -> bool) -> 'a list -> 'a list |
93 val dropwhile: ('a -> bool) -> 'a list -> 'a list |
94 val map_nth_elem: int -> ('a -> 'a) -> 'a list -> 'a list |
94 val map_nth_elem: int -> ('a -> 'a) -> 'a list -> 'a list |
172 val gen_mem: ('a * 'b -> bool) -> 'a * 'b list -> bool |
172 val gen_mem: ('a * 'b -> bool) -> 'a * 'b list -> bool |
173 val ins: ''a * ''a list -> ''a list |
173 val ins: ''a * ''a list -> ''a list |
174 val ins_int: int * int list -> int list |
174 val ins_int: int * int list -> int list |
175 val ins_string: string * string list -> string list |
175 val ins_string: string * string list -> string list |
176 val gen_ins: ('a * 'a -> bool) -> 'a * 'a list -> 'a list |
176 val gen_ins: ('a * 'a -> bool) -> 'a * 'a list -> 'a list |
|
177 val insert: ('a * 'a -> bool) -> 'a -> 'a list -> 'a list |
|
178 val remove: ('a * 'a -> bool) -> 'a -> 'a list -> 'a list |
177 val union: ''a list * ''a list -> ''a list |
179 val union: ''a list * ''a list -> ''a list |
178 val union_int: int list * int list -> int list |
180 val union_int: int list * int list -> int list |
179 val union_string: string list * string list -> string list |
181 val union_string: string list * string list -> string list |
180 val gen_union: ('a * 'a -> bool) -> 'a list * 'a list -> 'a list |
182 val gen_union: ('a * 'a -> bool) -> 'a list * 'a list -> 'a list |
181 val gen_inter: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list |
183 val gen_inter: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list |
190 val gen_subset: ('a * 'b -> bool) -> 'a list * 'b list -> bool |
192 val gen_subset: ('a * 'b -> bool) -> 'a list * 'b list -> bool |
191 val \ : ''a list * ''a -> ''a list |
193 val \ : ''a list * ''a -> ''a list |
192 val \\ : ''a list * ''a list -> ''a list |
194 val \\ : ''a list * ''a list -> ''a list |
193 val gen_rem: ('a * 'b -> bool) -> 'a list * 'b -> 'a list |
195 val gen_rem: ('a * 'b -> bool) -> 'a list * 'b -> 'a list |
194 val gen_rems: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list |
196 val gen_rems: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list |
195 val gen_remove: ('a * 'b -> bool) -> 'b -> 'a list -> 'a list |
|
196 val remove: ''a -> ''a list -> ''a list |
|
197 val gen_distinct: ('a * 'a -> bool) -> 'a list -> 'a list |
197 val gen_distinct: ('a * 'a -> bool) -> 'a list -> 'a list |
198 val distinct: ''a list -> ''a list |
198 val distinct: ''a list -> ''a list |
199 val findrep: ''a list -> ''a list |
199 val findrep: ''a list -> ''a list |
200 val gen_duplicates: ('a * 'a -> bool) -> 'a list -> 'a list |
200 val gen_duplicates: ('a * 'a -> bool) -> 'a list -> 'a list |
201 val duplicates: ''a list -> ''a list |
201 val duplicates: ''a list -> ''a list |
443 fun cons x xs = x :: xs; |
443 fun cons x xs = x :: xs; |
444 fun single x = [x]; |
444 fun single x = [x]; |
445 |
445 |
446 fun append xs ys = xs @ ys; |
446 fun append xs ys = xs @ ys; |
447 |
447 |
448 (* tail recursive version *) |
448 fun rev_append xs ys = List.revAppend (xs, ys); |
449 fun rev_append xs ys = List.revAppend(xs,ys); |
|
450 |
449 |
451 fun apply [] x = x |
450 fun apply [] x = x |
452 | apply (f :: fs) x = apply fs (f x); |
451 | apply (f :: fs) x = apply fs (f x); |
453 |
452 |
454 |
453 |
455 (* fold *) |
454 (* fold *) |
|
455 |
|
456 fun fold _ [] y = y |
|
457 | fold f (x :: xs) y = fold f xs (f x y); |
|
458 |
|
459 fun fold_rev _ [] y = y |
|
460 | fold_rev f (x :: xs) y = f x (fold_rev f xs y); |
|
461 |
|
462 fun foldl_map _ (x, []) = (x, []) |
|
463 | foldl_map f (x, y :: ys) = |
|
464 let |
|
465 val (x', y') = f (x, y); |
|
466 val (x'', ys') = foldl_map f (x', ys); |
|
467 in (x'', y' :: ys') end; |
456 |
468 |
457 (*the following versions of fold are designed to fit nicely with infixes*) |
469 (*the following versions of fold are designed to fit nicely with infixes*) |
458 |
470 |
459 (* (op @) (e, [x1, ..., xn]) ===> ((e @ x1) @ x2) ... @ xn |
471 (* (op @) (e, [x1, ..., xn]) ===> ((e @ x1) @ x2) ... @ xn |
460 for operators that associate to the left (TAIL RECURSIVE)*) |
472 for operators that associate to the left (TAIL RECURSIVE)*) |
475 fun foldr1 f l = |
487 fun foldr1 f l = |
476 let fun itr [x] = x |
488 let fun itr [x] = x |
477 | itr (x::l) = f(x, itr l) |
489 | itr (x::l) = f(x, itr l) |
478 in itr l end; |
490 in itr l end; |
479 |
491 |
480 fun fold f xs y = foldl (fn (y', x) => f x y') (y, xs); |
|
481 fun fold_rev f xs y = foldr (fn (x, y') => f x y') (xs, y); |
|
482 |
|
483 fun foldl_map _ (x, []) = (x, []) |
|
484 | foldl_map f (x, y :: ys) = |
|
485 let |
|
486 val (x', y') = f (x, y); |
|
487 val (x'', ys') = foldl_map f (x', ys); |
|
488 in (x'', y' :: ys') end; |
|
489 |
|
490 fun foldln f xs e = fst (foldl (fn ((e,i), x) => (f (x,i) e, i+1)) ((e,1),xs)); |
492 fun foldln f xs e = fst (foldl (fn ((e,i), x) => (f (x,i) e, i+1)) ((e,1),xs)); |
|
493 |
491 |
494 |
492 (* basic list functions *) |
495 (* basic list functions *) |
493 |
496 |
494 (*take the first n elements from a list*) |
497 (*take the first n elements from a list*) |
495 fun take (n, []) = [] |
498 fun take (n, []) = [] |
843 |
846 |
844 (*generalized membership test*) |
847 (*generalized membership test*) |
845 fun gen_mem eq (x, []) = false |
848 fun gen_mem eq (x, []) = false |
846 | gen_mem eq (x, y :: ys) = eq (x, y) orelse gen_mem eq (x, ys); |
849 | gen_mem eq (x, y :: ys) = eq (x, y) orelse gen_mem eq (x, ys); |
847 |
850 |
|
851 (*insert and remove*) |
|
852 fun insert eq x xs = if gen_mem eq (x, xs) then xs else x :: xs; |
|
853 fun remove eq x xs = if gen_mem eq (x, xs) then filter_out (fn y => eq (x, y)) xs else xs; |
848 |
854 |
849 (*insertion into list if not already there*) |
855 (*insertion into list if not already there*) |
850 fun (x ins xs) = if x mem xs then xs else x :: xs; |
856 fun (x ins xs) = if x mem xs then xs else x :: xs; |
851 |
857 |
852 (*insertion into list, optimized version for ints*) |
858 (*insertion into list, optimized version for ints*) |
854 |
860 |
855 (*insertion into list, optimized version for strings*) |
861 (*insertion into list, optimized version for strings*) |
856 fun (x ins_string xs) = if x mem_string xs then xs else x :: xs; |
862 fun (x ins_string xs) = if x mem_string xs then xs else x :: xs; |
857 |
863 |
858 (*generalized insertion*) |
864 (*generalized insertion*) |
859 fun gen_ins eq (x, xs) = if gen_mem eq (x, xs) then xs else x :: xs; |
865 fun gen_ins eq (x, xs) = insert eq x xs; |
860 |
|
861 |
866 |
862 (*union of sets represented as lists: no repetitions*) |
867 (*union of sets represented as lists: no repetitions*) |
863 fun xs union [] = xs |
868 fun xs union [] = xs |
864 | [] union ys = ys |
869 | [] union ys = ys |
865 | (x :: xs) union ys = xs union (x ins ys); |
870 | (x :: xs) union ys = xs union (x ins ys); |
932 fun ys \\ xs = foldl (op \) (ys,xs); |
937 fun ys \\ xs = foldl (op \) (ys,xs); |
933 |
938 |
934 (*removing an element from a list -- possibly WITH duplicates*) |
939 (*removing an element from a list -- possibly WITH duplicates*) |
935 fun gen_rem eq (xs, y) = filter_out (fn x => eq (x, y)) xs; |
940 fun gen_rem eq (xs, y) = filter_out (fn x => eq (x, y)) xs; |
936 fun gen_rems eq (xs, ys) = filter_out (fn x => gen_mem eq (x, ys)) xs; |
941 fun gen_rems eq (xs, ys) = filter_out (fn x => gen_mem eq (x, ys)) xs; |
937 |
|
938 fun gen_remove eq x xs = gen_rem eq (xs, x); |
|
939 fun remove x xs = gen_rem (op =) (xs, x); |
|
940 |
942 |
941 (*makes a list of the distinct members of the input; preserves order, takes |
943 (*makes a list of the distinct members of the input; preserves order, takes |
942 first of equal elements*) |
944 first of equal elements*) |
943 fun gen_distinct eq lst = |
945 fun gen_distinct eq lst = |
944 let |
946 let |