On Tuesday, January 6, 2015 7:38:00 PM UTC+10, Milan Bouchet-Valat wrote:
>
> Le lundi 05 janvier 2015 à 19:16 -0800, [email protected] <javascript:> 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}()`.
>
Yeah, (==){T}(a::Nullable{T}, b::T) should be able to be defined as
!isnull(a) && get(a) == b
Cheers
Lex
>
> 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
>