[Issue 13017] New: opEquals for null std.typecons.Nullable

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Wed Jul 2 03:34:11 PDT 2014


https://issues.dlang.org/show_bug.cgi?id=13017

          Issue ID: 13017
           Summary: opEquals for null std.typecons.Nullable
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: Phobos
          Assignee: nobody at puremagic.com
          Reporter: bearophile_hugs at eml.cc

This is a little Haskell program:


import Data.Maybe

f::Int -> Maybe Int
f 0 = Nothing
f x = Just x

main = do
    let a = f 0
    let b = f 0
    let c = f 10
    let d = f 10
    let e = f 20
    print $ a == b
    print $ a == c
    print $ c == d
    print $ d == e


Output:

True
False
True
False



This is a similar D program:


import std.stdio, std.typecons;

Nullable!int f(in int x) pure nothrow @safe @nogc {
    return (x == 0) ? typeof(return)() : typeof(return)(x);
}

void main() {
    immutable a = f(0);
    immutable b = f(0);
    immutable c = f(10);
    immutable d = f(10);
    immutable e = f(20);

    writeln(a == b);
    writeln(a == c);
    writeln(c == d);
    writeln(d == e);
}


But it raises an exception:

core.exception.AssertError at ...\dmd2\src\phobos\std\typecons.d(1361): Called
`get' on null Nullable!int.

I think here std.typecons.Nullable should act as the Haskell Maybe, and not
raise exceptions in that D program.

This means I'd like:

Nullable!int() == Nullable!int()    ===> true
Nullable!int(5) == Nullable!int()   ===> false
Nullable!int() == Nullable!int(5)   ===> false
Nullable!int(5) == Nullable!int(5)  ===> true
Nullable!int(5) == Nullable!int(10) ===> false


This is quite handy because allows to compare two nullables avoiding code like:

if ((a.isNull && b.isNull) || a == b) {

Replacing it with a more natural and equally safe (as in Haskell):

if (a == b) {

--


More information about the Digitalmars-d-bugs mailing list