<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 <<a href="mailto:antonyzhilin@gmail.com" class="">antonyzhilin@gmail.com</a>> 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 <<a href="mailto:matthew@anandabits.com" target="_blank" class="">matthew@anandabits.com</a>>:</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. There is nothing wrong with this at all. Your second `exec` would not accept a non-throwing function because `Never` cannot conform to `Default`. 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? 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? 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. It is not possible to express such a function with `rethrows`. You can’t talk about the error type at all. 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. 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`. 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. 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. 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>