[Ur] equality types and xml

Adam Chlipala adamc at impredicative.com
Wed Sep 7 08:33:49 EDT 2011


Gergely Buday wrote:
> do I understand correctly that only the following built-in types admit equality?
>
> class eq
> val eq : t ::: Type ->  eq t ->  t ->  t ->  bool
> val ne : t ::: Type ->  eq t ->  t ->  t ->  bool
> val eq_int : eq int
> val eq_float : eq float
> val eq_string : eq string
> val eq_char : eq char
> val eq_bool : eq bool
> val eq_time : eq time
> val mkEq : t ::: Type ->  (t ->  t ->  bool) ->  eq t
>    

You are free to add equality witnesses for any type at all.  You may 
even shadow the built-in witnesses in local contexts.  (Though I 
wouldn't want to make a strong statement about which witness would be 
chosen by automatic resolution in such a case. ;])

> And, what about xml? Is it not possible to compare two xml fragments?
>    

No [eq] instance for the [xml] family is provided in the standard 
library.  You can see that [xml] _does_ have a [show] instance, which 
provides an easy path to equality testing, but this operation (and a few 
others) frightens me in its capacity to break abstraction, by, for 
instance, revealing implementation choices for abstract types.  I may 
make the compiler by default warn about uses of such scary functionality.

> And, the only other types that have equality are those that I create
> an equality function with mkEq for?
>    

Right.



More information about the Ur mailing list