changeset 1736:7ec8dab190a7

Better discovery of type class instances from recursive definitions
author Adam Chlipala <adam@chlipala.net>
date Wed, 02 May 2012 08:34:50 -0400
parents ec47f49c6aa3
children 78d7cc9c9b18
files src/elaborate.sml tests/newMessage.ur
diffstat 2 files changed, 19 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/elaborate.sml	Wed May 02 08:23:30 2012 -0400
+++ b/src/elaborate.sml	Wed May 02 08:34:50 2012 -0400
@@ -3912,8 +3912,11 @@
                                                                   expError env (IllegalRec (x, e'));
                                                               ((x, n, c', e'), gs1 @ gs)
                                                           end) gs vis
+
+                    val vis = map (fn (x, n, t, e) => (x, n, normClassConstraint env t, e)) vis
+                    val d = (L'.DValRec vis, loc)
                 in
-                    ([(L'.DValRec vis, loc)], (env, denv, gs))
+                    ([d], (E.declBinds env d, denv, gs))
                 end
 
               | L.DSgn (x, sgn) =>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/newMessage.ur	Wed May 02 08:34:50 2012 -0400
@@ -0,0 +1,15 @@
+datatype message =  NewQuestion of { Id : string}
+                  | Something of {Blah : int}
+
+fun showMessage (message : message) =
+    case message of
+        NewQuestion {Id = a} => a
+      | Something {Blah = x} => "blah"
+
+val show_mes = mkShow showMessage
+
+fun showTwoTuple [a] [b] (_ : show a) (_: show b) = mkShow (fn (two_tuple : {1:a, 2:b}) =>
+                              "(" ^ show two_tuple.1 ^ ", " ^ show two_tuple.2 ^ ")"
+
+                          )
+val om = show  (Something {Blah = 1}, Something {Blah = 2})