Justin Johansson escribió:
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?

So after invoking max on the list you would want to know whether it contains a single element or it's the empty list, right? If so, why not asking it before invoking the max function?

if (xs.isEmpty) {
  // no max, do something
} else {
  auto max = max(xs);
  // do something *else*
}

I've seen this code a lot of times, and it being:

auto max = max(xs);
if (max.isEmpty) {
  // no max, do something
} else {
  // do something *else*
}

is exactly the same thing, unless you are planning to do something with the list that contains max.

At least one of the first things I learned when studying computer science if function pre and postconditions, and max's is "list is not empty". :)

What's wrong with that?

Reply via email to