Le lundi 05 janvier 2015 à 19:16 -0800, ele...@gmail.com a écrit : > My reasoning for Nullable{T} is that it is type stable. Taking your > example, None and Int would be different type objects, introducing a > type instability and potential performance penalty. But Nullable{T} > is always type Nullable{T} and get(Nullable{T}) is always type T. > Allowing Nullable{T} to decay into T would re-introduce the type > instability. Right. But that doesn't mean `Nullable(3) == 3` shouldn't return `true`. This operation could be allowed, provided that `Nullable{Int}() == 3` raised a `NullException` or returned `Nullable{Bool}()`.
Regarding the original question: > On Tuesday, January 6, 2015 12:03:24 PM UTC+10, Seth wrote: > I'm trying to figure out how (and under what circumstances) > one would use Nullable. That is, it seems that it might be > valuable when you don't know whether the value/object exists > (sort of like Python's None, I guess), but then something like > "Nullable(3) == 3" returns false, and that sort of messes up > how I'm thinking about it. > > > The code I'd imagine would be useful would be something like > > > function foo(x::Int, y=Nullable{Int}()) # that is, y defaults > to python's "None" but is restricted to Int > if !isnull(y) > return x+y # x + get(y) works, but why must we invoke > another method to get the value? > else > return 2x > end > end > > > I'm left wondering why it wasn't reasonable to allow y to > return get(y) if not null, else raise a NullException, The question is how you define "return". In the strict sense, if you write `return y`, then `y` must be returned, not `get(y)`, or the Julia language would really be a mess. That said, with return type declarations, if `foo()::Int` allowed stating that `foo()` always returns an `Int`, then `y` could automatically be converted to an `Int`, raising an exception if it's `null`. But that merely allows you to type `return y` instead of `return get(y)`, so not a big deal. Finally, there's the question of whether `x + y` should be allowed to mean `x + get(y)`. That's debatable, but I think a more useful behavior would be to make it equivalent to `isnull(y) ? Nullable(x + get(y)) : Nullable{Int}()`. That would allow handling the possibility of missingness only when you actually want to get an `Int` from a `Nullable{Int}`. This has been discussed more generally for any function call at https://github.com/JuliaLang/julia/pull/9446 > and the conclusion I'm coming to is that I don't understand > the concept of Nullable yet. Any pointers? > Regards