Mercurial > urweb
changeset 256:e52243e20858
'eq' type class
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sun, 31 Aug 2008 15:15:41 -0400 |
parents | 69d337f186eb |
children | 32f9212583b2 |
files | lib/basis.urs src/elaborate.sml src/urweb.grm tests/eq.ur |
diffstat | 4 files changed, 28 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/lib/basis.urs Sun Aug 31 15:04:10 2008 -0400 +++ b/lib/basis.urs Sun Aug 31 15:15:41 2008 -0400 @@ -7,6 +7,16 @@ datatype bool = False | True +(** Basic type classes *) + +class eq +val eq : t ::: Type -> eq t -> t -> t -> bool +val eq_int : eq int +val eq_float : eq float +val eq_string : eq string +val eq_bool : eq bool + + (** SQL *) con sql_table :: {Type} -> Type
--- a/src/elaborate.sml Sun Aug 31 15:04:10 2008 -0400 +++ b/src/elaborate.sml Sun Aug 31 15:15:41 2008 -0400 @@ -1584,11 +1584,12 @@ checkKind env t' tk ktype; (t', gs) end - val (e', et, gs2) = elabExp (E.pushERel env x t', denv) e + val (dom, gs2) = normClassConstraint (env, denv) t' + val (e', et, gs3) = elabExp (E.pushERel env x dom, denv) e in ((L'.EAbs (x, t', et, e'), loc), (L'.TFun (t', et), loc), - enD gs1 @ gs2) + enD gs1 @ enD gs2 @ gs3) end | L.ECApp (e, c) => let
--- a/src/urweb.grm Sun Aug 31 15:04:10 2008 -0400 +++ b/src/urweb.grm Sun Aug 31 15:15:41 2008 -0400 @@ -141,6 +141,15 @@ (EApp (e, sqlexp2), loc) end +fun native_op (oper, e1, e2, loc) = + let + val e = (EVar (["Basis"], oper), loc) + val e = (EApp (e, (EWild, loc)), loc) + val e = (EApp (e, e1), loc) + in + (EApp (e, e2), loc) + end + %% %header (functor UrwebLrValsFn(structure Token : TOKEN)) @@ -595,6 +604,7 @@ in (EApp (e, (EAbs (SYMBOL, NONE, eexp2), loc)), loc) end) + | eexp EQ eexp (native_op ("eq", eexp1, eexp2, s (eexp1left, eexp2right))) eargs : earg (earg) | eargl (eargl)