Thanks Sam, that clears things up!  

-- Éric


On Oct 22, 2011, at 6:25 PM, Sam Tobin-Hochstadt wrote:

> On Sat, Oct 22, 2011 at 2:20 PM, Eric Tanter <etan...@dcc.uchile.cl> wrote:
>> On Oct 21, 2011, at 1:55 PM, Sam Tobin-Hochstadt wrote:
>>> On Fri, Oct 21, 2011 at 12:44 PM, Eric Tanter <etan...@dcc.uchile.cl> wrote:
>>>> In that sense, union types are a particularly good example. They are 
>>>> necessary to support the kind of patterns found in previously-untyped 
>>>> code. But if I'm writing typed code, and I'm using union types, then I'd 
>>>> expect a case construct based on the type. Sure enough, this won't be code 
>>>> for which I could just "remove the types".
>>> 
>>> What would such a construct look like?  Forms like `cases' from PLAI
>>> work fine in plain Racket.
>> 
>> [AFAIK, plai does not have `cases', but only `type-case'; from looking 
>> through the docs, it seems `cases' is the eopl construct, doing the same 
>> thing]
>> 
>> type-case works fine, but is not based on static types. It only works for a 
>> named datatype with variants:
>> (define (foo x)
>> (type-case MyStruct x
>>  (variant1 ...)
>>  (variant2 ...))
>> 
>> Now, with static types, I can have the following:
>> 
>> (: foo ((U Number String) -> Any))
>> (define (foo x)
>> (type-case x    ; <- not based on a single datatype
>>  (Number ...)
>>  (String ...)))
> 
> Would this behave any differently than:
> 
> (cond
>  [(number? x) ...]
>  [(string? x) ...])
> 
> Certainly, Typed Racket could provide a macro that encapsulated this
> translation, but note that it doesn't work for plenty of cases, such
> as function types.  Additionally, it will be vastly less efficient
> than something like `type-case', where everything is a tagged
> structure.
> 
>> It makes sense only in the typed language because Number and String are 
>> static types, not variant tags. And it is possible to be exhaustive, 
>> ensuring that the case analysis covers all the parts of the union.
>> 
>> But I am indeed stating the obvious (that's TAPL chapter on sums), so I must 
>> be missing something...
> 
> The difference is that EOPL/PLAI-style type defintions are exactly
> like the sum types describe in TAPL, but Typed Racket union types are
> very different.  In particular, sums have tags, whereas unions do not
> have tags.  For example:
> 
>  (U (Number -> String) (String -> Number))
> 
> There are no tags in the value that distinguish one from the other.
> -- 
> sam th
> sa...@ccs.neu.edu
> 


_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/users

Reply via email to