<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<font size="4"><font face="monospace">Here's how we would define
this in Haskell:<br>
<br>
data Result t = Succ t | Error Throwable<br>
<br>
or maybe (Either-style)<br>
<br>
data Result t e = Succ t | Error e<br>
<br>
Note that in either, `Error` is still generic in `t`, its just
that it doesn't use `t`, so it doesn't say `t`. Similarly, in
the latter, both alternatives are generic in both tvars, but
each uses only one of them. <br>
<br>
The Java analogue here is:<br>
<br>
sealed interface Result<T> { }<br>
record Succ<T>(T t) implements Result<T> { }<br>
record Fail<T>(Throwable t) implements Result<T>
{ }<br>
<br>
What you are probably reacting to here is "but why does Fail
have to say T, it doesn't use it." And the answer is: "get over
that, and then you're done." <br>
<br>
You are trying to invent a new generics feature to avoid putting
a `T` you don't use in your Error declaration. But that T (and
maybe E) are needed to unify the two under Result<T,E> --
just like in the second Haskell example above. <br>
<br>
<br>
</font></font><br>
<div class="moz-cite-prefix">On 6/13/2023 3:17 PM, Remi Forax wrote:<br>
</div>
<blockquote type="cite" cite="mid:1095327035.80244534.1686683845970.JavaMail.zimbra@univ-eiffel.fr">
<pre class="moz-quote-pre" wrap="">Hello,
currently, it's not possible to write a lot of generics sealed type because Java has no way to denote the bottom type.
By example, if a Result can be either a Success or an Error, we want to be able to write this kind of switch
public static void main(String[] args) {
Result<String, IOException> result = ...
var val = switch(result) {
case Error<IOException> error -> 1;
case Success<String> success -> 2;
};
}
But i do not see a way to do that without introducing a way to denote the bottom type (named "Nothing" here)
sealed interface Result<T,E extends Exception> {}
record Error<E extends Exception>(E error) implements Result<Nothing, E> {}
record Success<T>(T value) implements Result<T, Nothing> { }
Nothing being the return type of a method that either never terminate (by example, using a for(;;)) or always throw an exception.
So, should we add Nothing to Java or is there another way to model this kind of sealed types ?
regards,
RĂ©mi
</pre>
</blockquote>
<br>
</body>
</html>