> Pony often uses the primitive None to indicate that something has "no value".
So that is not a special value that we can assign to any variable.
"None" would seem to be pretty pointless all by itself, but I guess we could do a union of any old type with "None", to get a result much like Haskell's "Maybe". And then the Pony type system would give us much the same guarantees as Haskell's would; so we get a nullable variable that still allows for typesafe operations -- e.g., dereferencing, if applicable. (I guess ....)
> Of course, it does have a value, so that you can check what it is, and the value is the single instance of None.From the page I linked above:
> var x: (String | None)
> Here we have an example of using a union to express an optional type, where x might be a String, but it also might be None.
That's pretty clearly a Maybe.
EDIT: Ugh, sorry, those are the same, I was thinking of sum vs _product_ type, ignore me.
Rust supports tagged unions, but can also optimize them to untagged in certain circumstances. We will probably add some kind of untagged union as well, mostly for FFI, but they're very unsafe, for the above reasons.
http://tutorial.ponylang.org/pattern-matching/match/#matchin...
I see how it can be used in new and different ways, and is definitely safer, but it's not like the idea of "that thing you want isn't here" goes away by introducing a None type.
EDIT: Sorry, I was thinking of sum vs product here, union types are sum types. So this is the same thing as Option. Sounds good. The advantage of using a union type is that you _have_ to check. This is significantly better than nulls.
(I am 99% sure that's what you mean, but since I already screwed up terms once in this thread...)
Disjoint unions aka sum types (as seen in Haskell/ML etc) entail some runtime way of keeping track which side of the sum any given inhabitant lies on. Tags are one way to do this, but e.g. in a language where pointers/references are never the zero machine word, and unit is represented as the zero word, no tag would be needed for the type Maybe String.
Union types (as seen in Pony, apparently, and also in Typed Racket), by contrast, /don't/ preserve information about which side of the union an inhabitant came from.
So, disjoint types: A + A ≠ A but union types: A ∪ A = A
So expanding (Maybe X) into (X + 1), we have that (Maybe (Maybe X)) = ((X + 1) + 1) ≠ X + 1,
but if instead (Maybe X) expands to (X ∪ 1), we have that (Maybe (Maybe X)) = ((X ∪ 1) ∪ 1) = X ∪ 1 = (Maybe X).
This is one of the problems with uses of null in languages that have it.
Pony's "None" type is an example of a "unit type": a type with only one possible value. It's a totally different thing.