[Ur] type system expressivity
    Adam Chlipala 
    adamc at impredicative.com
       
    Mon Oct  3 10:00:57 EDT 2011
    
    
  
Here's a quick example.  I was a bit surprised at the need to invoke 
[sourcify_list] directly in the example at the end, but it seems like a 
clear step up compared to your manual implementation.
structure Sourcify : sig
     class sourcify :: Type -> Type -> Type
     val mkSourcify : t1 ::: Type -> t2 ::: Type -> (t1 -> transaction 
t2) -> sourcify t1 t2
     val sourcify : t1 ::: Type -> t2 ::: Type -> sourcify t1 t2 -> t1 
-> transaction t2
end = struct
     class sourcify = fn t1 t2 => t1 -> transaction t2
     fun mkSourcify [t1] [t2] (x : t1 -> transaction t2) = x
     fun sourcify [t1] [t2] (f : t1 -> transaction t2) x = f x
end
open Sourcify
val sourcify_int : sourcify int _ = mkSourcify source
val sourcify_float : sourcify float _ = mkSourcify source
val sourcify_string : sourcify string _ = mkSourcify source
fun sourcify_list [t1] [t2] (_ : sourcify t1 t2) : sourcify (list t1) 
(list t2) =
     mkSourcify (List.mapM sourcify)
fun sourcify_record [r ::: {(Type * Type)}] (fl : folder r) (s : $(map 
(fn (t1, t2) => sourcify t1 t2) r))
     : sourcify $(map fst r) $(map snd r) =
     mkSourcify (@Monad.mapR2 _ [fn (t1, t2) => sourcify t1 t2] [fst] [snd]
                  (fn [nm ::_] [t ::_] f x => @sourcify f x) fl s)
(* Test case *)
type test = {A : int, B : float, C : list string}
val sourcify_list_string : sourcify (list string) _ = sourcify_list
val sourcify_test : sourcify test _ = sourcify_record
val sourcify_list_test : sourcify (list test) _ = sourcify_list
val f : list test -> _ = sourcify
    
    
More information about the Ur
mailing list