bearophile Wrote:

> Justin Johansson:
> > What's the best way of emulating a system of quantified type unions in D  
> > (D1)?
> 
> Having nullable values may be useful, having nonnull class references can 
> probably be very useful, having tagged unions (I am talking as C unions here) 
> can be useful. But can you show me some usercases/purposes for what you are 
> asking for? I think other people too here are curious.

Thanks for asking.  Here's a use case.  Suppose you have a container class 
which represents a list of numbers.  Let's call this class ListOfNums. Now a 
ListOfNums can contain zero or more numbers.  Now you want a function called 
max that takes a ListOfNums, xs, as an argument and returns the number in the 
list, xs, that is greater than or equal to all other numbers in xs.

So if xs contains (3, 9, 9, 2), max( xs) returns 9.

Now it makes sense that xs should contain at least one number, so if xs 
contains just (3), max( xs) returns 3.

But what if xs contains no numbers i.e. xs = (), the empty list?  What should 
max( xs) return in the way of a meaningful result short of throwing an 
exception?

Put another way, what is the maximum number in an empty list of numbers?

If you allow the numbers in the list to be real, then I suppose you could 
return NaN but there is no way of expressing NaN if the numbers you are dealing 
with are purely integer .. and it certainly is not a good idea to make a 
function that is dealing purely with integers to return a real just allow the 
corner case to return NaN (a real).

An elegant solution to this problem is to specify the max function as taking a 
quantified list of zero or more numbers and returning another quantified list 
of numbers which may contain either zero numbers or just one number: zero 
numbers if the argument list is empty and a single number (being the maximum 
number in the argument list) if the argument number list is non-empty. 

The important point in this solution is realizing a type system that treats a 
list of zero_or_one numbers, a list of zero numbers, a list of zero_or_more 
numbers, etc, as distinct types.

Trust this makes sense.

<JJ/>

Reply via email to