Le mardi 06 janvier 2015 à 04:38 -0800, [email protected] a écrit :
>
>
> 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] 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
I'd consider this definition (which is different from the ones I
suggested above) as unsafe: if `a` is `null`, then you silently get
`false`. Better provide additional safety by either returning a
`Nullable`, or raising an exception.
>
> 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