<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">This is a continuation of this <a href="https://mail.openjdk.org/pipermail/amber-dev/2023-March/007849.html">thread</a>, unfortunately I only joined the mailing list, so I can’t reply to it so I apologize for opening a new thread.</p>
<p style="margin:0px 0px 1.2em!important">I want to point to <a href="https://koka-lang.github.io/koka/doc/book.html#why-effects">Koka</a>, Koka is a language built upon the concept of Effect, a generalization of how Java treats checked exceptions (and similarly to what Brian Goetz said about how Checked exceptions are equivalent to Either, general Effect system is equivalent to full monadic type system).</p>
<p style="margin:0px 0px 1.2em!important">The language is very interesting and worth reading about, but the relevant part is their Polymorphic Effects, which allow you to extend the effects. In Java pseudo code, it means that the following is valid:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-java" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)">
<span class="hljs-annotation">@FunctionalInterface</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">interface</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">EPredicate</span><<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">T</span>, <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">E</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extends</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Throwable</span>> </span>{
    <span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">boolean</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">test</span><span class="hljs-params">(T t)</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">throws</span> E</span>;
}

<span class="hljs-annotation">@FunctionalInterface</span>
<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">interface</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">EConsumer</span><<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">T</span>, <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">E</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extends</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Throwable</span>> </span>{
    <span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">boolean</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">test</span><span class="hljs-params">(T t)</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">throws</span> E</span>;
}

<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> <span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">class</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">EStream</span><<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">V</span>,<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">E</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">extends</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Throwable</span>> </span>{
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> <EX extends Throwable> EStream<V, (E|EX)> filter(EPredicate<? <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">super</span> T, (E|EX)> predicate) {
        ...
    }

    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> <EX extends Throwable> <span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">void</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">forEach</span><span class="hljs-params">(EConsumer<? <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">super</span> T, (E|EX)</span>> action) <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">throws</span> E, EX </span>{
        ...
    }
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">Which allows you to have a fluent composition without losing the fine-grained checked exceptions:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-java" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)">
<span class="hljs-function"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">public</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">static</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">void</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">main</span><span class="hljs-params">(string[] args)</span> <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">throws</span> FileNotFoundException, IllegalAccessException, SQLException </span>{
    myEStream.filter(v -> ...) <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// something that throws FileNotFoundException</span>
                     .filter(v -> ...) <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// something that throws IllegalAccessException</span>
                     .forEach(v -> ...); <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// something that throws SQLException</span>
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">This also makes the type system of the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">throws</code> clause a subset of the generics type system.</p>
<p style="margin:0px 0px 1.2em!important">While I do believe that the actual solution will require much more thought than this (e.g. deconstruction of generic sums to be able to handle specific exceptions and remove those exceptions from the final union type of exceptions), this is a showcase that a nice and composable checked exceptions works even without Monadic types.</p>
<p style="margin:0px 0px 1.2em!important">I find this direction much nicer than using Either everywhere.</p>
<div title="MDH:VGhpcyBpcyBhIGNvbnRpbnVhdGlvbiBvZiB0aGlzIFt0aHJlYWRdKGh0dHBzOi8vbWFpbC5vcGVu
amRrLm9yZy9waXBlcm1haWwvYW1iZXItZGV2LzIwMjMtTWFyY2gvMDA3ODQ5Lmh0bWwpLCB1bmZv
cnR1bmF0ZWx5IEkgb25seSBqb2luZWQgdGhlIG1haWxpbmcgbGlzdCwgc28gSSBjYW4ndCByZXBs
eSB0byBpdCBzbyBJIGFwb2xvZ2l6ZSBmb3Igb3BlbmluZyBhIG5ldyB0aHJlYWQuPGRpdj48YnI+
PC9kaXY+PGRpdj5JIHdhbnQgdG8gcG9pbnQgdG8gW0tva2FdKGh0dHBzOi8va29rYS1sYW5nLmdp
dGh1Yi5pby9rb2thL2RvYy9ib29rLmh0bWwjd2h5LWVmZmVjdHMpLCBLb2thIGlzIGEgbGFuZ3Vh
Z2UgYnVpbHQgdXBvbiB0aGUgY29uY2VwdCBvZiBFZmZlY3QsIGEgZ2VuZXJhbGl6YXRpb24gb2Yg
aG93IEphdmEgdHJlYXRzIGNoZWNrZWQgZXhjZXB0aW9ucyAoYW5kIHNpbWlsYXJseSB0byB3aGF0
Jm5ic3A7PHNwYW4gc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IHdoaXRlLXNwYWNlOiBwcmUt
d3JhcDsiPkJyaWFuIEdvZXR6IHNhaWQgYWJvdXQgaG93IENoZWNrZWQgZXhjZXB0aW9ucyBhcmUg
ZXF1aXZhbGVudCB0byBFaXRoZXIsIGdlbmVyYWwgRWZmZWN0IHN5c3RlbSBpcyBlcXVpdmFsZW50
IHRvIGZ1bGwgbW9uYWRpYyB0eXBlIHN5c3RlbSk8L3NwYW4+LjwvZGl2PjxkaXY+PGJyPjwvZGl2
PjxkaXY+VGhlIGxhbmd1YWdlIGlzIHZlcnkgaW50ZXJlc3RpbmcgYW5kIHdvcnRoIHJlYWRpbmcg
YWJvdXQsIGJ1dCB0aGUgcmVsZXZhbnQmbmJzcDtwYXJ0IGlzIHRoZWlyJm5ic3A7UG9seW1vcnBo
aWMgRWZmZWN0cywgd2hpY2ggYWxsb3cgdG8gPGk+ZXh0ZW5kPC9pPiZuYnNwO3RoZSBlZmZlY3Rz
LiBJbiBKYXZhIHBzZXVkbyZuYnNwO2NvZGUsIGl0IG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBp
cyB2YWxpZDo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYGphdmE8L2Rpdj48ZGl2Pjxicj48
L2Rpdj48ZGl2PkBGdW5jdGlvbmFsSW50ZXJmYWNlPGJyPjwvZGl2PjxkaXY+cHVibGljIGludGVy
ZmFjZSBFUHJlZGljYXRlJmx0O1QsIEUgZXh0ZW5kcyBUaHJvd2FibGUmZ3Q7IHs8L2Rpdj48ZGl2
PiZuYnNwOyAmbmJzcDsmbmJzcDtib29sZWFuIHRlc3QoVCB0KSB0aHJvd3MgRTs8L2Rpdj48ZGl2
Pn08L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxkaXY+QEZ1bmN0aW9uYWxJbnRlcmZhY2U8YnI+
PC9kaXY+PGRpdj5wdWJsaWMgaW50ZXJmYWNlIEVDb25zdW1lciZsdDtULCBFIGV4dGVuZHMgVGhy
b3dhYmxlJmd0OyB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7Jm5ic3A7Ym9vbGVhbiB0ZXN0KFQg
dCkgdGhyb3dzIEU7PC9kaXY+PGRpdj59PC9kaXY+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5w
dWJsaWMgY2xhc3MgRVN0cmVhbSZsdDtWLEUgZXh0ZW5kcyBUaHJvd2FibGUmZ3Q7IHs8L2Rpdj48
ZGl2PiZuYnNwOyAmbmJzcDsgcHVibGljICZsdDtFWCBleHRlbmRzIFRocm93YWJsZSZndDsgRVN0
cmVhbSZsdDtWLCAoRXxFWCkmZ3Q7IGZpbHRlcihFUHJlZGljYXRlJmx0Oz8gc3VwZXIgVCwgKEV8
RVgpJmd0OyBwcmVkaWNhdGUpIHs8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw
OyAuLi48L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgfTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
Jm5ic3A7ICZuYnNwOyBwdWJsaWMgJmx0O0VYIGV4dGVuZHMgVGhyb3dhYmxlJmd0OyB2b2lkIGZv
ckVhY2goRUNvbnN1bWVyJmx0Oz8gc3VwZXIgVCwgKEV8RVgpJmd0OyBhY3Rpb24pIHRocm93cyBF
LCBFWCB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgLi4uPC9kaXY+PGRp
dj4mbmJzcDsgJm5ic3A7IH08L2Rpdj48ZGl2Pn08L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBg
YDwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+V2hpY2ggYWxsb3dzIHlvdSB0byBoYXZlIGEgZmx1
ZW50IGNvbXBvc2l0aW9uIHdpdGhvdXQgbG9zaW5nIHRoZSBmaW5lLWdyYWluZWQgY2hlY2tlZCBl
eGNlcHRpb25zOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgamF2YTwvZGl2PjxkaXY+PGJy
PjwvZGl2PjxkaXY+cHVibGljIHN0YXRpYyB2b2lkIG1haW4oc3RyaW5nW10gYXJncykgdGhyb3dz
IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgU1FMRXhjZXB0
aW9uIHs8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgbXlFU3RyZWFtLmZpbHRlcih2IC0mZ3Q7IC4u
LikgLy8gc29tZXRoaW5nIHRoYXQgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbjxicj4mbmJz
cDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNw
OyAmbmJzcDsgJm5ic3A7LmZpbHRlcih2IC0mZ3Q7IC4uLikgLy8gc29tZXRoaW5nIHRoYXQgdGhy
b3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb248YnI+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOy5mb3JFYWNo
KHYgLSZndDsgLi4uKTsgLy8gc29tZXRoaW5nIHRoYXQgdGhyb3dzIFNRTEV4Y2VwdGlvbjwvZGl2
PjxkaXY+fTwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgPC9kaXY+PGRpdj48YnI+PC9kaXY+
PGRpdj5UaGlzIGFsc28gbWFrZXMgdGhlIHR5cGUgc3lzdGVtIG9mIHRoZSBgdGhyb3dzYCBjbGF1
c2UgYSBzdWJzZXQgb2YgdGhlIGdlbmVyaWNzIHR5cGUgc3lzdGVtLjwvZGl2PjxkaXY+PGJyPjwv
ZGl2PjxkaXY+V2hpbGUgSSBkbyBiZWxpZXZlIHRoYXQgdGhlIGFjdHVhbCBzb2x1dGlvbiB3aWxs
IHJlcXVpcmUgbXVjaCBtb3JlIHRob3VnaHQgdGhhbiB0aGlzIChlLmcuIGRlY29uc3RydWN0aW9u
IG9mIGdlbmVyaWMgc3VtcyB0byBiZSBhYmxlIHRvIGhhbmRsZSBzcGVjaWZpYyBleGNlcHRpb25z
IGFuZCByZW1vdmUgdGhvc2UgZXhjZXB0aW9ucyBmcm9tIHRoZSBmaW5hbCB1bmlvbiB0eXBlIG9m
IGV4Y2VwdGlvbnMpLCB0aGlzIGlzIGEgc2hvd2Nhc2UgdGhhdCBhIG5pY2UgYW5kIGNvbXBvc2Fi
bGUgY2hlY2tlZCBleGNlcHRpb25zIHdvcmtzIGV2ZW4gd2l0aG91dCBNb25hZGljIHR5cGVzLjwv
ZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSBmaW5kIHRoaXMgZGlyZWN0aW9uIG11Y2ggbmljZXIg
dGhhbiB1c2luZyBFaXRoZXIgZXZlcnl3aGVyZS48L2Rpdj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xv
cjogcmdiKDAsIDAsIDApOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7Ij48L3NwYW4+PC9kaXY+PGRp
dj48ZGl2Pjxicj48L2Rpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0"></div></div><div><span class="gmail_signature_prefix markdown-here-signature">-- </span><br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">Holo The Wise Wolf Of Yoitsu</div></div></div></div>