<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 20, 2017, at 3:58 AM, Anton Zhilin &lt;<a href="mailto:antonyzhilin@gmail.com" class="">antonyzhilin@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important" class="">2017-02-19 23:29 GMT+03:00 Matthew Johnson &lt;<a href="mailto:matthew@anandabits.com" target="_blank" class="">matthew@anandabits.com</a>&gt;:</p><div style="margin: 0px 0px 1.2em !important;" class=""><br class="webkit-block-placeholder"></div><div class="markdown-here-exclude"><div class=""><br class="webkit-block-placeholder"></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class="">Thanks.&nbsp; There is nothing wrong with this at all.&nbsp; Your second `exec` would not accept a non-throwing function because `Never` cannot conform to `Default`.&nbsp; If it didn’t include the `Default` constraint it would not be able to `throw E()`.</div></div></blockquote><div class=""><br class="webkit-block-placeholder"></div></div><div style="margin: 0px 0px 1.2em !important;" class=""><br class="webkit-block-placeholder"></div><p style="margin:0px 0px 1.2em!important" class="">But that raises another concern. In a previous discussion, it was taken for granted that <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" class="">Never</code> should conform to all protocols</p></div></div></div></blockquote><div>Do you have a pointer to this discussion? &nbsp;I must have missed it.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important" class="">, because if one obtains an instance of <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" class="">Never</code> (and they won’t), then everything is possible. But now we say that <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" class="">Never</code> can’t conform to <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" class="">Default</code>, because this would break its very invariant. Also it can’t conform to any protocol with static members or initializers.</p><div class=""><br class=""></div></div></div></div></blockquote><div><br class=""></div><div>It seems highly problematic to me to say that never conforms to any protocol with non-instance requirements.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important" class="">But then basically, <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" class="">Never</code> trick can’t be used when we request anything more than <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" class="">Error</code> from generic error type (with static members or initializers). So this approach turns out to be more limiting than <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" class="">rethrows</code>.<br class=""></p></div></div></div></blockquote><div>Can you elaborate here? &nbsp;If you require a function to throw an error type that has non-instance requirements then you would necessarily be restricting callers to provide a throwing function. &nbsp;It is not possible to express such a function with `rethrows`. &nbsp;You can’t talk about the error type at all. &nbsp;If you could talk about the error type and were able to constrain it in this way `rethrows` would necessarily have to exhibit the same behavior as the generic version. &nbsp;The behavior arises out of the constraint you are applying, not the mechanism by which you forward the type.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important" class="">Don’t misunderstand me—I love the idea of <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" class="">Never</code> replacing <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" class="">rethrows</code>. Just want to make sure we don’t lose anything important by the way.</p><div class=""><br class=""></div></div></div></div></blockquote><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><div style="margin: 0px 0px 1.2em !important;" class=""><br class="webkit-block-placeholder"></div><div class="markdown-here-exclude"><div class=""><br class="webkit-block-placeholder"></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class="">If you remove the `Default` constraint and change `throws(E)` to `throws`, and throw `MyError()` in place of `E()` in both places then it behaves exactly as the first example. We don’t lose any expressivity at all.</div><div class=""><br class=""></div><div class="">This is actually an example of a strength of Joe’s suggestion: the second `exec` is able to throw an error of a type that matches the error that might be thrown by the calling argument `f`.&nbsp; I’m not sure of where this might be useful but it is definitely not possible with `rethrows` while it is possible with Joe’s proposal.&nbsp; We have more flexibility in API design under Joe’s proposal.</div></div></blockquote><div class=""><br class="webkit-block-placeholder"></div></div><div style="margin: 0px 0px 1.2em !important;" class=""><br class="webkit-block-placeholder"></div><p style="margin:0px 0px 1.2em!important" class="">Nice. Whether we can throw the error ourselves depends on our ability to create the error.</p><div style="margin: 0px 0px 1.2em !important;" class=""><br class="webkit-block-placeholder"></div><div class="markdown-here-exclude"><div class=""><br class="webkit-block-placeholder"></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><div class="">You did make a great point about coalescing error types from several different function arguments.&nbsp; That’s an edge case, but the inability to coalesce is indeed a problem that probably needs to be addressed by the typed throws proposal in one way or another (if we don’t go with Joe’s suggestion we would need to specify how `rethrows` behaves in cases like this in some detail).</div></div></blockquote><div class=""><br class="webkit-block-placeholder"></div></div><div style="margin: 0px 0px 1.2em !important;" class=""><br class="webkit-block-placeholder"></div>
<div title="MDH:PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj4yMDE3LTAy
LTE5IDIzOjI5IEdNVCswMzowMCBNYXR0aGV3IEpvaG5zb24gPHNwYW4gZGlyPSJsdHIiPiZsdDs8
YSBocmVmPSJtYWlsdG86bWF0dGhld0BhbmFuZGFiaXRzLmNvbSIgdGFyZ2V0PSJfYmxhbmsiPm1h
dHRoZXdAYW5hbmRhYml0cy5jb208L2E+Jmd0Ozwvc3Bhbj46PGJsb2NrcXVvdGUgY2xhc3M9Imdt
YWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mg
c29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PGRpdiBzdHlsZT0id29yZC13cmFwOmJyZWFrLXdvcmQi
PjxkaXY+VGhhbmtzLiAmbmJzcDtUaGVyZSBpcyBub3RoaW5nIHdyb25nIHdpdGggdGhpcyBhdCBh
bGwuICZuYnNwO1lvdXIgc2Vjb25kIGBleGVjYCB3b3VsZCBub3QgYWNjZXB0IGEgbm9uLXRocm93
aW5nIGZ1bmN0aW9uIGJlY2F1c2UgYE5ldmVyYCBjYW5ub3QgY29uZm9ybSB0byBgRGVmYXVsdGAu
ICZuYnNwO0lmIGl0IGRpZG7igJl0IGluY2x1ZGUgdGhlIGBEZWZhdWx0YCBjb25zdHJhaW50IGl0
IHdvdWxkIG5vdCBiZSBhYmxlIHRvIGB0aHJvdyBFKClgLjwvZGl2PjwvZGl2PjwvYmxvY2txdW90
ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PkJ1dCB0aGF0IHJhaXNlcyBhbm90aGVyIGNvbmNlcm4uIElu
IGEgcHJldmlvdXMgZGlzY3Vzc2lvbiwgaXQgd2FzIHRha2VuIGZvciBncmFudGVkIHRoYXQgYE5l
dmVyYCBzaG91bGQgY29uZm9ybSB0byBhbGwgcHJvdG9jb2xzLCBiZWNhdXNlIGlmIG9uZSBvYnRh
aW5zIGFuIGluc3RhbmNlIG9mIGBOZXZlcmAgKGFuZCB0aGV5IHdvbid0KSwgdGhlbiBldmVyeXRo
aW5nIGlzIHBvc3NpYmxlLiBCdXQgbm93IHdlIHNheSB0aGF0IGBOZXZlcmAgY2FuJ3QgY29uZm9y
bSB0byBgRGVmYXVsdGAsIGJlY2F1c2UgdGhpcyB3b3VsZCBicmVhayBpdHMgdmVyeSBpbnZhcmlh
bnQuIEFsc28gaXQgY2FuJ3QgY29uZm9ybSB0byBhbnkgcHJvdG9jb2wgd2l0aCBzdGF0aWMgbWVt
YmVycyBvciBpbml0aWFsaXplcnMuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5CdXQgdGhlbiBi
YXNpY2FsbHksIGBOZXZlcmAgdHJpY2sgY2FuJ3QgYmUgdXNlZCB3aGVuIHdlIHJlcXVlc3QgYW55
dGhpbmcgbW9yZSB0aGFuIGBFcnJvcmAgZnJvbSBnZW5lcmljIGVycm9yIHR5cGUgKHdpdGggc3Rh
dGljIG1lbWJlcnMgb3IgaW5pdGlhbGl6ZXJzKS4gU28gdGhpcyBhcHByb2FjaCB0dXJucyBvdXQg
dG8gYmUgbW9yZSBsaW1pdGluZyB0aGFuIGByZXRocm93c2AuPC9kaXY+PGRpdj5Eb24ndCBtaXN1
bmRlcnN0YW5kIG1lLS1JIGxvdmUgdGhlIGlkZWEgb2YgYE5ldmVyYCByZXBsYWNpbmcgYHJldGhy
b3dzYC4gSnVzdCB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBsb3NlIGFueXRoaW5nIGltcG9y
dGFudCBieSB0aGUgd2F5LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxibG9ja3F1b3RlIGNsYXNzPSJn
bWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2Nj
IHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPjxkaXYgc3R5bGU9IndvcmQtd3JhcDpicmVhay13b3Jk
Ij48ZGl2PklmIHlvdSByZW1vdmUgdGhlIGBEZWZhdWx0YCBjb25zdHJhaW50IGFuZCBjaGFuZ2Ug
YHRocm93cyhFKWAgdG8gYHRocm93c2AsIGFuZCB0aHJvdyBgTXlFcnJvcigpYCBpbiBwbGFjZSBv
ZiBgRSgpYCBpbiBib3RoIHBsYWNlcyB0aGVuIGl0IGJlaGF2ZXMgZXhhY3RseSBhcyB0aGUgZmly
c3QgZXhhbXBsZS4gV2UgZG9u4oCZdCBsb3NlIGFueSBleHByZXNzaXZpdHkgYXQgYWxsLjwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhpcyBpcyBhY3R1YWxseSBhbiBleGFtcGxlIG9mIGEgc3Ry
ZW5ndGggb2YgSm9l4oCZcyBzdWdnZXN0aW9uOiB0aGUgc2Vjb25kIGBleGVjYCBpcyBhYmxlIHRv
IHRocm93IGFuIGVycm9yIG9mIGEgdHlwZSB0aGF0IG1hdGNoZXMgdGhlIGVycm9yIHRoYXQgbWln
aHQgYmUgdGhyb3duIGJ5IHRoZSBjYWxsaW5nIGFyZ3VtZW50IGBmYC4gJm5ic3A7SeKAmW0gbm90
IHN1cmUgb2Ygd2hlcmUgdGhpcyBtaWdodCBiZSB1c2VmdWwgYnV0IGl0IGlzIGRlZmluaXRlbHkg
bm90IHBvc3NpYmxlIHdpdGggYHJldGhyb3dzYCB3aGlsZSBpdCBpcyBwb3NzaWJsZSB3aXRoIEpv
ZeKAmXMgcHJvcG9zYWwuICZuYnNwO1dlIGhhdmUgbW9yZSBmbGV4aWJpbGl0eSBpbiBBUEkgZGVz
aWduIHVuZGVyIEpvZeKAmXMgcHJvcG9zYWwuPC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjxkaXY+
PGJyPjwvZGl2PjxkaXY+TmljZS4gV2hldGhlciB3ZSBjYW4gdGhyb3cgdGhlIGVycm9yIG91cnNl
bHZlcyBkZXBlbmRzIG9uIG91ciBhYmlsaXR5IHRvIGNyZWF0ZSB0aGUgZXJyb3IuPC9kaXY+PGRp
dj48YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2lu
OjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+
PGRpdiBzdHlsZT0id29yZC13cmFwOmJyZWFrLXdvcmQiPjxkaXY+WW91IGRpZCBtYWtlIGEgZ3Jl
YXQgcG9pbnQgYWJvdXQgY29hbGVzY2luZyBlcnJvciB0eXBlcyBmcm9tIHNldmVyYWwgZGlmZmVy
ZW50IGZ1bmN0aW9uIGFyZ3VtZW50cy4gJm5ic3A7VGhhdOKAmXMgYW4gZWRnZSBjYXNlLCBidXQg
dGhlIGluYWJpbGl0eSB0byBjb2FsZXNjZSBpcyBpbmRlZWQgYSBwcm9ibGVtIHRoYXQgcHJvYmFi
bHkgbmVlZHMgdG8gYmUgYWRkcmVzc2VkIGJ5IHRoZSB0eXBlZCB0aHJvd3MgcHJvcG9zYWwgaW4g
b25lIHdheSBvciBhbm90aGVyIChpZiB3ZSBkb27igJl0IGdvIHdpdGggSm9l4oCZcyBzdWdnZXN0
aW9uIHdlIHdvdWxkIG5lZWQgdG8gc3BlY2lmeSBob3cgYHJldGhyb3dzYCBiZWhhdmVzIGluIGNh
c2VzIGxpa2UgdGhpcyBpbiBzb21lIGRldGFpbCkuPC9kaXY+PC9kaXY+PC9ibG9ja3F1b3RlPjwv
ZGl2PjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0" class="">​</div></div></div>
</div></blockquote></div><br class=""></body></html>