fun first f [] = NONE
| first f (x :: xs) = (case f x of NONE => first f xs | s => s);
fun maps (_ : 'a -> 's -> 'b * 's) [] = unit []
| maps f (x :: xs) =
bind (f x) (fn y => bind (maps f xs) (fn ys => unit (y :: ys)));
fun mapsPartial (_ : 'a -> 's -> 'b option * 's) [] = unit []
| mapsPartial f (x :: xs) =
bind
(f x)
(fn yo =>
bind
(mapsPartial f xs)
(fn ys => unit (case yo of NONE => ys | SOME y => y :: ys)));
fun zipWith f = let fun z l [] [] = l
| z l (x :: xs) (y :: ys) = z (f x y :: l) xs ys
| z _ _ _ = raise Error "zipWith: lists different lengths"; in
fn xs => fn ys => List.rev (z [] xs ys) end;
fun zip xs ys = zipWith pair xs ys;
local fun inc ((x,y),(xs,ys)) = (x :: xs, y :: ys); in fun unzip ab = List.foldl inc ([],[]) (List.rev ab); end;
fun cartwith f = let fun aux _ res _ [] = res
| aux xsCopy res [] (y :: yt) = aux xsCopy res xsCopy yt
| aux xsCopy res (x :: xt) (ys as y :: _) =
aux xsCopy (f x y :: res) xt ys in
fn xs => fn ys => letval xs' = List.rev xs in aux xs' [] xs' (List.rev ys) end end;
fun cart xs ys = cartwith pair xs ys;
fun takeWhile p = let fun f acc [] = List.rev acc
| f acc (x :: xs) = if p x then f (x :: acc) xs elseList.rev acc in
f [] end;
fun dropWhile p = let fun f [] = []
| f (l as x :: xs) = if p x then f xs else l in
f end;
fun divideWhile p = let fun f acc [] = (List.rev acc, [])
| f acc (l as x :: xs) = if p x then f (x :: acc) xs else (List.rev acc, l) in
f [] end;
fun groups f = let fun group acc row x l = case l of
[] => let val acc = ifList.null row then acc elseList.rev row :: acc in List.rev acc end
| h :: t => let val (eor,x) = f (h,x) in if eor then group (List.rev row :: acc) [h] x t else group acc (h :: row) x t end in
group [] [] end;
fun groupsBy eq = let fun f (x_y as (x,_)) = (not (eq x_y), x) in
fn [] => []
| h :: t => case groups f h t of
[] => [[h]]
| hs :: ts => (h :: hs) :: ts end;
local fun fstEq ((x,_),(y,_)) = x = y;
fun collapse l = (fst (hd l), List.map snd l); in fun groupsByFst l = List.map collapse (groupsBy fstEq l); end;
fun groupsOf n = let fun f (_,i) = if i = 1 then (true,n) else (false, i - 1) in
groups f (n + 1) end;
fun index p = let fun idx _ [] = NONE
| idx n (x :: xs) = if p x then SOME n else idx (n + 1) xs in
idx 0 end;
fun enumerate l = fst (maps (fn x => fn m => ((m, x), m + 1)) l 0);
local fun revDiv acc l 0 = (acc,l)
| revDiv _ [] _ = raise Subscript
| revDiv acc (h :: t) n = revDiv (h :: acc) t (n - 1); in fun revDivide l = revDiv [] l; end;
fun divide l n = letval (a,b) = revDivide l n in (List.rev a, b) end;
fun updateNth (n,x) l = let val (a,b) = revDivide l n in case b of [] => raise Subscript | _ :: t => List.revAppend (a, x :: t) end;
fun deleteNth n l = let val (a,b) = revDivide l n in case b of [] => raise Subscript | _ :: t => List.revAppend (a,t) end;
(* Finding the minimum and maximum element of a list, wrt some order. *)
fun minimum cmp = let fun min (l,m,r) _ [] = (m, List.revAppend (l,r))
| min (best as (_,m,_)) l (x :: r) =
min (case cmp (x,m) of LESS => (l,x,r) | _ => best) (x :: l) r in
fn [] => raise Empty
| h :: t => min ([],h,t) [h] t end;
fun maximum cmp = minimum (revCompare cmp);
(* Merge (for the following merge-sort, but generally useful too). *)
fun merge cmp = let fun mrg acc [] ys = List.revAppend (acc,ys)
| mrg acc xs [] = List.revAppend (acc,xs)
| mrg acc (xs as x :: xt) (ys as y :: yt) =
(case cmp (x,y) of
GREATER => mrg (y :: acc) xs yt
| _ => mrg (x :: acc) xt ys) in
mrg [] end;
(* Merge sort (stable). *)
fun sort cmp = let fun findRuns acc r rs [] = List.rev (List.rev (r :: rs) :: acc)
| findRuns acc r rs (x :: xs) = case cmp (r,x) of
GREATER => findRuns (List.rev (r :: rs) :: acc) x [] xs
| _ => findRuns acc x (r :: rs) xs
fun mergeAdj acc [] = List.rev acc
| mergeAdj acc (xs as [_]) = List.revAppend (acc,xs)
| mergeAdj acc (x :: y :: xs) = mergeAdj (merge cmp x y :: acc) xs
fun mergePairs [xs] = xs
| mergePairs l = mergePairs (mergeAdj [] l) in
fn [] => []
| l as [_] => l
| h :: t => mergePairs (findRuns [] h [] t) end;
fun sortMap _ _ [] = []
| sortMap _ _ (l as [_]) = l
| sortMap f cmp xs = let fun ncmp ((m,_),(n,_)) = cmp (m,n) val nxs = List.map (fn x => (f x, x)) xs val nys = sort ncmp nxs in List.map snd nys end;
fun interval m 0 = []
| interval m len = m :: interval (m + 1) (len - 1);
fun divides _ 0 = true
| divides 0 _ = false
| divides a b = b mod (Int.abs a) = 0;
local fun hcf 0 n = n
| hcf 1 _ = 1
| hcf m n = hcf (n mod m) m; in fun gcd m n = let val m = Int.abs m and n = Int.abs n in if m < n then hcf m n else hcf n m end; end;
val upper = len (String.explode "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
val lower = len (String.explode "abcdefghijklmnopqrstuvwxyz");
fun rotate (n,l) c k = List.nth (l, (k + Option.valOf (index (equal c) l)) mod n); in fun rot k c = if Char.isLower c then rotate lower c k elseif Char.isUpper c then rotate upper c k else c; end;
fun charToInt #"0" = SOME 0
| charToInt #"1" = SOME 1
| charToInt #"2" = SOME 2
| charToInt #"3" = SOME 3
| charToInt #"4" = SOME 4
| charToInt #"5" = SOME 5
| charToInt #"6" = SOME 6
| charToInt #"7" = SOME 7
| charToInt #"8" = SOME 8
| charToInt #"9" = SOME 9
| charToInt _ = NONE;
fun charFromInt 0 = SOME #"0"
| charFromInt 1 = SOME #"1"
| charFromInt 2 = SOME #"2"
| charFromInt 3 = SOME #"3"
| charFromInt 4 = SOME #"4"
| charFromInt 5 = SOME #"5"
| charFromInt 6 = SOME #"6"
| charFromInt 7 = SOME #"7"
| charFromInt 8 = SOME #"8"
| charFromInt 9 = SOME #"9"
| charFromInt _ = NONE;
fun nChars x = let fun dup 0 l = l | dup n l = dup (n - 1) (x :: l) in
fn n => String.implode (dup n []) end;
fun chomp s = let val n = size s in if n = 0 orelse String.sub (s, n - 1) <> #"\n"then s elseString.substring (s, 0, n - 1) end;
local fun chop l = case l of
[] => []
| h :: t => if Char.isSpace h then chop t else l; in val trim = String.implode o chop o List.rev o chop o List.rev o String.explode; end;
val join = String.concatWith;
local funmatch [] l = SOME l
| match _ [] = NONE
| match (x :: xs) (y :: ys) = if x = y thenmatch xs ys else NONE;
fun stringify acc [] = acc
| stringify acc (h :: t) = stringify (String.implode h :: acc) t; in fun split sep = let val pat = String.explode sep
fun div1 prev recent [] = stringify [] (List.rev recent :: prev)
| div1 prev recent (l as h :: t) = casematch pat l of
NONE => div1 prev (h :: recent) t
| SOME rest => div1 (List.rev recent :: prev) [] rest in
fn s => div1 [] [] (String.explode s) end; end;
fun capitalize s = if s = ""then s else str (Char.toUpper (String.sub (s,0))) ^ String.extract (s,1,NONE);
fun mkPrefix p s = p ^ s;
fun destPrefix p = let fun check s = ifString.isPrefix p s then () elseraise Error "destPrefix"
val sizeP = size p in
fn s => let val () = check s in String.extract (s,sizeP,NONE) end end;
fun isPrefix p = can (destPrefix p);
fun stripPrefix pred s = Substring.string (Substring.dropl pred (Substring.full s));
fun mkSuffix p s = s ^ p;
fun destSuffix p = let fun check s = ifString.isSuffix p s then () elseraise Error "destSuffix"
val sizeP = size p in
fn s => let val () = check s
val sizeS = size s in String.substring (s, 0, sizeS - sizeP) end end;
fun isSuffix p = can (destSuffix p);
fun stripSuffix pred s = Substring.string (Substring.dropr pred (Substring.full s));
type columnAlignment = {leftAlign : bool, padChar : char}
fun alignColumn {leftAlign,padChar} column = let val (n,_) = maximum Int.compare (List.mapsize column)
fun pad entry row = let val padding = nChars padChar (n - size entry) in if leftAlign then entry ^ padding ^ row else padding ^ entry ^ row end in
zipWith pad column end;
local fun alignTab aligns rows = case aligns of
[] => List.map (K "") rows
| [{leftAlign = true, padChar = #" "}] => List.map hd rows
| align :: aligns => let val col = List.map hd rows and cols = alignTab aligns (List.map tl rows) in
alignColumn align col cols end; in fun alignTable aligns rows = ifList.null rows then [] else alignTab aligns rows; end;
fun chat s = TextIO.output (TextIO.stdOut, s ^ "\n");
fun chide s = TextIO.output (TextIO.stdErr, s ^ "\n");
local fun err x s = chide (x ^ ": " ^ s); in funtry f x = f x handle e as Error _ => (err "try" (errorToString e); raise e)
| e as Bug _ => (err "try" (bugToString e); raise e)
| e => (err "try""strange exception raised"; raise e);
val warn = err "WARNING";
fun die s = (err "\nFATAL ERROR" s; OS.Process.exit OS.Process.failure); end;
fun timed f a = let val tmr = Timer.startCPUTimer ()
val res = f a
val {usr,sys,...} = Timer.checkCPUTimer tmr in
(Time.toReal usr + Time.toReal sys, res) end;
local val MIN = 1.0;
fun several n t f a = let val (t',res) = timed f a val t = t + t' val n = n + 1 in if t > MIN then (t / Real.fromInt n, res) else several n t f a end; in fun timedMany f a = several 0 0.0 f a end;
val executionTime = let val startTime = Time.toReal (Time.now ()) in
fn () => Time.toReal (Time.now ()) - startTime end;
end
¤ Dauer der Verarbeitung: 0.16 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.