summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demo/sum.ur10
-rw-r--r--lib/ur/top.ur13
-rw-r--r--lib/ur/top.urs6
3 files changed, 24 insertions, 5 deletions
diff --git a/demo/sum.ur b/demo/sum.ur
index 9391637a..566b7899 100644
--- a/demo/sum.ur
+++ b/demo/sum.ur
@@ -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 <xml><body>
- {[sum {}]}<br/>
- {[sum {A = 0, B = 1}]}<br/>
- {[sum {C = 2, D = 3, E = 4}]}
+ {[sum Folder.nil {}]}<br/>
+ {[sum (Folder.cons [#A] [()] (Folder.cons [#B] [()] Folder.nil)) {A = 0, B = 1}]}<br/>
+ {[sum (Folder.cons [#D] [()] (Folder.cons [#C] [()] (Folder.cons [#E] [()] Folder.nil))) {C = 2, D = 3, E = 4}]}
</body></xml>
diff --git a/lib/ur/top.ur b/lib/ur/top.ur
index 9016fd27..5d2ae606 100644
--- a/lib/ur/top.ur
+++ b/lib/ur/top.ur
@@ -6,6 +6,19 @@ con folder = K ==> fn r :: {K} =>
-> 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 --git a/lib/ur/top.urs b/lib/ur/top.urs
index d891c80d..d4cd34f4 100644
--- a/lib/ur/top.urs
+++ b/lib/ur/top.urs
@@ -6,6 +6,12 @@ con folder = K ==> fn r :: {K} =>
-> 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