# HG changeset patch # User Adam Chlipala # Date 1235342395 18000 # Node ID f4f2b09a533aa760a45d2c3ffd905e2b2513b5d3 # Parent 230654093b51ed8eebf2107ce99d4bab4172ae26 demo/sum working with manual folders diff -r 230654093b51 -r f4f2b09a533a demo/sum.ur --- a/demo/sum.ur Sun Feb 22 17:17:01 2009 -0500 +++ b/demo/sum.ur Sun Feb 22 17:39:55 2009 -0500 @@ -1,10 +1,10 @@ -fun sum (fs ::: {Unit}) (x : $(mapUT int fs)) = +fun sum (fs ::: {Unit}) (fold : folder fs) (x : $(mapUT int fs)) = foldUR [int] [fn _ => int] (fn (nm :: Name) (rest :: {Unit}) [[nm] ~ rest] n acc => n + acc) - 0 [fs] x + 0 [fs] fold x fun main () = return - {[sum {}]}
- {[sum {A = 0, B = 1}]}
- {[sum {C = 2, D = 3, E = 4}]} + {[sum Folder.nil {}]}
+ {[sum (Folder.cons [#A] [()] (Folder.cons [#B] [()] Folder.nil)) {A = 0, B = 1}]}
+ {[sum (Folder.cons [#D] [()] (Folder.cons [#C] [()] (Folder.cons [#E] [()] Folder.nil))) {C = 2, D = 3, E = 4}]}
diff -r 230654093b51 -r f4f2b09a533a lib/ur/top.ur --- a/lib/ur/top.ur Sun Feb 22 17:17:01 2009 -0500 +++ b/lib/ur/top.ur Sun Feb 22 17:39:55 2009 -0500 @@ -6,6 +6,19 @@ -> fn [[nm] ~ r] => tf ([nm = v] ++ r)) -> tf [] -> tf r +structure Folder = struct + fun nil K (tf :: {K} -> Type) + (f : nm :: Name -> v :: K -> r :: {K} -> tf r + -> fn [[nm] ~ r] => tf ([nm = v] ++ r)) + (i : tf []) = i + + fun cons K (r ::: {K}) (nm :: Name) (v :: K) [[nm] ~ r] (fold : folder r) + (tf :: {K} -> Type) + (f : nm :: Name -> v :: K -> r :: {K} -> tf r + -> fn [[nm] ~ r] => tf ([nm = v] ++ r)) + (i : tf []) = f [nm] [v] [r] (fold [tf] f i) +end + fun not b = if b then False else True diff -r 230654093b51 -r f4f2b09a533a lib/ur/top.urs --- a/lib/ur/top.urs Sun Feb 22 17:17:01 2009 -0500 +++ b/lib/ur/top.urs Sun Feb 22 17:39:55 2009 -0500 @@ -6,6 +6,12 @@ -> fn [[nm] ~ r] => tf ([nm = v] ++ r)) -> tf [] -> tf r +structure Folder : sig + val nil : K --> folder (([]) :: {K}) + val cons : K --> r ::: {K} -> nm :: Name -> v :: K + -> fn [[nm] ~ r] => folder r -> folder ([nm = v] ++ r) +end + val not : bool -> bool