From: Vijay S. <vi...@sa...> - 2009-07-08 05:29:02
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body bgcolor="#ffffff" text="#000000"> Problem: Given a two-headed type system -- with <tt>struct Struct</tt> and <tt>class Object</tt> as the two heads -- how does one provide a signature for the <tt>equals</tt> method?<br> <br> Solution: <br> <br> (0) Distinguish between two relationships on types: <br> <ul> <li> <tt>_ is a subtype of _</tt> (written: <tt>_ <: _</tt>). If <tt>S <: T</tt>, then in every context a value of type <tt>S</tt> can substitute for a value of type <tt>T</tt>. Thus a value of type <tt>S</tt> can be assigned to a variable of type <tt>T</tt>. <br> </li> <li> <tt>_ behaves as _</tt> (written: <tt>_ <| _</tt>). If <tt>S</tt> behaves as <tt>T</tt> then all methods available on <tt>T</tt> are available on <tt>S</tt>, but it is not necessarily the case that a value of type s can be assigned to a variable of type T. For instance, S may be a struct and I an interface.</li> <li><tt>S <: T</tt> implies <tt>S <| T</tt><br> </li> </ul> (1) Introduce <tt>x.Type</tt>. For any struct or object x, <tt>x.Type</tt> is the struct or class of which x is an instance. <br> <br> (2) Assert (and ensure) that the X10 type system validates: <tt><br> </tt> <blockquote><tt>for all x. (x.Type <: Struct or x.Type <: Object)</tt><br> </blockquote> <br> (3) Define <br> <br> <tt>interface Equals {<br> def equals[T](x:T){this.Type <: T}:boolean;<br> }</tt><br> <br> (4) Have Struct implement Equals:<br> <br> <tt>package x10.lang;<br> abstract struct Struct implements Equals {}</tt><br> <br> Hence <tt>Struct <| Equals</tt><br> <br> (5) Have Object implement Equals:<br> <br> <tt>package x10.lang;<br> class Object implements Equals {<br> def equals[T](x:T){this.Type <: T} = this == x;<br> ...<br> }<br> </tt>Hence <tt>Object <| Equals<br> <br> </tt>(5) Hence the type system can establish: <tt>for all x. x.Type <| Equals. </tt>Therefore in the body of a class G with a type parameter X, and x:X, it is legal to invoke <tt>x.equals(y)</tt> as long as it can be established that <tt>y:Y</tt> and <tt>X <: Y</tt>.<br> </body> </html> |