DIP 1017--Add Bottom Type--Final Review
Paul Backus
snarwin at gmail.com
Wed Jan 16 23:08:38 UTC 2019
On Wednesday, 16 January 2019 at 11:23:18 UTC, Johan Engelen
wrote:
> This is just another example of using the bottom type to
> signify `noreturn`, which is trivially done with an attribute
> and doesn't need a new type. I'd like to see _other_ practical
> uses of the bottom type.
>
> -Johan
Here's an example I ran into while working on my `expectations`
library. [1]
Internally, an Expected!(T, E) is represented as a discriminated
union containing either an "expected" value of type T or an error
value of type E. I would like to implement a property method,
`value`, that either returns the expected value if there is one,
or throws an exception if there isn't (similar to Rust's
`unwrap`).
The obvious implementation looks like this:
struct Expected(T, E) {
private SumType!(T, E) data;
@property T value() {
return data.match!(
(T val) => val,
(E err) { throw new Exception(err.to!string); }
);
}
}
However, this will not compile, because the second lambda is
inferred to have a return type of void, and void is not
implicitly convertible to T. Instead, I have to resort to the
following ugly workaround:
@property T value() {
try {
return data.tryMatch!(
(T val) => val
);
} catch (MatchException _) {
data.tryMatch!(
(E err) => throw new Exception(err.to!string)
);
}
}
If the second lambda were inferred to have a return type of
Tbottom, none of this would be necessary. The first version would
Just Work™.
[1] http://expectations.dub.pm
More information about the Digitalmars-d
mailing list