On Saturday, 13 September 2014 at 15:36:30 UTC, bearophile wrote:
This is a little Haskell program that uses the Maybe type constructor:


foo :: Int -> Maybe Int
foo x | x < 10 = Just x
foo _          = Nothing

main = do
    print $ foo 5
    print $ foo 15


Its output:

Just 5
Nothing




This is a similar D program, that uses Nullable:

import std.stdio, std.typecons;

Nullable!int foo(int x) {
    return (x < 10) ?
           typeof(return)(x) :
           typeof(return)();
}

void main() {
    writeln(foo(5));
    writeln(foo(15));
}


Its output:

5
core.exception.AssertError@C:\dmd2\src\phobos\std\typecons.d(1515): Called `get' on null Nullable!int.
...


I think it's better for write(Nullable!int()) to not raise an error, but to print something like a "<null>" etc.

A bigger problem is in the usage of Nullable. I'd like the D type system to be modified and improved to support Nullables with a nicer syntax.

Bye,
bearophile

I think Nullable should be completely replaced with an Option!T type that is also a range, and one that also doesn't `alias this` itself to its store. Then the above code would just print "[]" for an empty range. I'm sure you remember this thread: http://forum.dlang.org/thread/[email protected]

The problem is that Nullable internally has a `get` function that checks if it is "null", and throw an error if so. It then does `alias get this`, which means that in some contexts, operations will be forwarded to `get`, and I guess one of those contexts is when passing the Nullable to writeln. I've run into this problem before, and I *thought* it had been fixed, but I guess not.

Reply via email to