<div><br></div><div><br></div><div><br><div class="gmail_quote"><div>On Sun, Feb 19, 2017 at 2:34 PM Anton Zhilin via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_msg"><div class="m_-5940626585113039258markdown-here-wrapper gmail_msg"><p style="margin:0px 0px 1.2em!important" class="gmail_msg">Now that I think about it, generic throws does not exactly cover <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="gmail_msg">rethrows</code>.<br class="gmail_msg">Firstly, <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="gmail_msg">rethrows</code> has semantic information that function itself does not throw—it would be lost.</p></div></div></blockquote><div><br></div><div>That&#39;s not true. Parametric polymorphism guarantees that rethrows and polymorphic throw are the same. </div><div><br></div><div>For example, you can prove that as a consequence of parametricity that there is only one (pure) function in the of the set of all functions with the type ``forall A. A -&gt; A&#39;&#39; and furthermore that it is the identity function.</div><div><br></div><div>The intuition behind this is that you (meaning the fiction; imagine being a function!) cannot construct your own value of &quot;A&quot; since you don&#39;t have any information about what &quot;A&quot; is. The only place to get an &quot;A&quot; is from your argument.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_msg"><div class="m_-5940626585113039258markdown-here-wrapper gmail_msg"><p style="margin:0px 0px 1.2em!important" class="gmail_msg"></p>
<p style="margin:0px 0px 1.2em!important" class="gmail_msg">Secondly, <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="gmail_msg">rethrows</code> allows a function with multiple throwing function parameters to become non-throwing iff all the arguments are non-throwing.<br class="gmail_msg">How would you express it with generics?<br class="gmail_msg">In the proposal, in this case you are required to provide a non-generic supertype of all used error types. This type can’t just turn into <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="gmail_msg">Never</code> automatically.</p>
<p style="margin:0px 0px 1.2em!important" class="gmail_msg">One solution would be to retain <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="gmail_msg">rethrows</code> as an additional attribute.<br class="gmail_msg">It would help with semantic information, and resulting error will be able to turn into <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="gmail_msg">Never</code> as a special case—now that we know, that this function doesn’t throw that error itself.</p></div></div><div class="gmail_msg"><div class="m_-5940626585113039258markdown-here-wrapper gmail_msg">
<p style="margin:0px 0px 1.2em!important" class="gmail_msg">2017-02-19 0:16 GMT+03:00 Martin Waitz &lt;<a href="mailto:tali@admingilde.org" class="gmail_msg" target="_blank">tali@admingilde.org</a>&gt;:</p>
<p style="margin:0px 0px 1.2em!important" class="gmail_msg"></p><div class="m_-5940626585113039258markdown-here-exclude gmail_msg"><p class="gmail_msg"></p><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><span class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">Am 18.02.2017 um 17:37 schrieb Matthew Johnson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt;:</div><br class="m_-5940626585113039258m_-5212946143225501370m_-3606562864695778611Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div style="word-wrap:break-word" class="gmail_msg">Thank you for taking the time to put this proposal together Anton!  I really want to see typed throws make it into Swift 4.  This will be a very nice feature to have.<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I noticed that you included Joe Groff’s idea of replacing `rethrows` by making every function have an error type which is by default `Never` for non-throwing functions and `Error` for throwing functions that do not specify an error type.  </div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I want to urge you to consider updating the proposal to take this direction now rather than later.  This is a breaking change which means the longer we wait the harder it is to justify.  In fact, I think incorporating the breaking change could increase the chances of it being accepted for Swift 4.  Without that it is a purely additive change and those are not being given priority in the Swift 4 release.</div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></span><div class="gmail_msg">Seconded.</div><div class="gmail_msg">With typed throwing function parameters, it makes a lot of sense to be able to specify the rethrown type, based on the function given as parameter.<br class="gmail_msg"></div></div></div></blockquote><p class="gmail_msg"></p></div><p style="margin:0px 0px 1.2em!important" class="gmail_msg"></p>
<div title="MDH:PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj5Ob3cgdGhh
dCBJIHRoaW5rIGFib3V0IGl0LCBnZW5lcmljIHRocm93cyBkb2VzIG5vdCBleGFjdGx5IGNvdmVy
IGByZXRocm93c2AuPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPkZpcnN0bHksIGByZXRo
cm93c2AgaGFzIHNlbWFudGljIGluZm9ybWF0aW9uIHRoYXQgZnVuY3Rpb24gaXRzZWxmIGRvZXMg
bm90IHRocm93LS1pdCB3b3VsZCBiZSBsb3N0LjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3Rl
Ij48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPlNlY29uZGx5LCBgcmV0aHJvd3Ng
IGFsbG93cyBhIGZ1bmN0aW9uIHdpdGggbXVsdGlwbGUgdGhyb3dpbmcgZnVuY3Rpb24gcGFyYW1l
dGVycyB0byBiZWNvbWUgbm9uLXRocm93aW5nIGlmZiBhbGwgdGhlIGFyZ3VtZW50cyBhcmUgbm9u
LXRocm93aW5nLjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj5Ib3cgd291bGQgeW91IGV4
cHJlc3MgaXQgd2l0aCBnZW5lcmljcz88L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+SW4g
dGhlIHByb3Bvc2FsLCBpbiB0aGlzIGNhc2UgeW91IGFyZSByZXF1aXJlZCB0byBwcm92aWRlIGEg
bm9uLWdlbmVyaWMgc3VwZXJ0eXBlIG9mIGFsbCB1c2VkIGVycm9yIHR5cGVzLiBUaGlzIHR5cGUg
Y2FuJ3QganVzdCB0dXJuIGludG8gYE5ldmVyYCBhdXRvbWF0aWNhbGx5LjwvZGl2PjxkaXYgY2xh
c3M9ImdtYWlsX3F1b3RlIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPk9uZSBz
b2x1dGlvbiB3b3VsZCBiZSB0byByZXRhaW4gYHJldGhyb3dzYCBhcyBhbiBhZGRpdGlvbmFsIGF0
dHJpYnV0ZS48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90ZSI+SXQgd291bGQgaGVscCB3aXRo
IHNlbWFudGljIGluZm9ybWF0aW9uLCBhbmQgcmVzdWx0aW5nIGVycm9yIHdpbGwgYmUgYWJsZSB0
byB0dXJuIGludG8gYE5ldmVyYCBhcyBhIHNwZWNpYWwgY2FzZS0tbm93IHRoYXQgd2Uga25vdywg
dGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgdGhyb3cgdGhhdCBlcnJvciBpdHNlbGYuPC9kaXY+
PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9xdW90
ZSI+MjAxNy0wMi0xOSAwOjE2IEdNVCswMzowMCBNYXJ0aW4gV2FpdHogPHNwYW4gZGlyPSJsdHIi
PiZsdDs8YSBocmVmPSJtYWlsdG86dGFsaUBhZG1pbmdpbGRlLm9yZyIgdGFyZ2V0PSJfYmxhbmsi
PnRhbGlAYWRtaW5naWxkZS5vcmc8L2E+Jmd0Ozwvc3Bhbj46PGJyPjxibG9ja3F1b3RlIGNsYXNz
PSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAj
Y2NjIHNvbGlkO3BhZGRpbmctbGVmdDoxZXgiPjxkaXYgc3R5bGU9IndvcmQtd3JhcDpicmVhay13
b3JkIj48YnI+PGRpdj48c3Bhbj48YmxvY2txdW90ZSB0eXBlPSJjaXRlIj48ZGl2PkFtIDE4LjAy
LjIwMTcgdW0gMTc6Mzcgc2NocmllYiBNYXR0aGV3IEpvaG5zb24gdmlhIHN3aWZ0LWV2b2x1dGlv
biAmbHQ7PGEgaHJlZj0ibWFpbHRvOnN3aWZ0LWV2b2x1dGlvbkBzd2lmdC5vcmciIHRhcmdldD0i
X2JsYW5rIj5zd2lmdC1ldm9sdXRpb25Ac3dpZnQub3JnPC9hPiZndDs6PC9kaXY+PGJyIGNsYXNz
PSJtXy01MjEyOTQ2MTQzMjI1NTAxMzcwbV8tMzYwNjU2Mjg2NDY5NTc3ODYxMUFwcGxlLWludGVy
Y2hhbmdlLW5ld2xpbmUiPjxkaXY+PGRpdiBzdHlsZT0id29yZC13cmFwOmJyZWFrLXdvcmQiPlRo
YW5rIHlvdSBmb3IgdGFraW5nIHRoZSB0aW1lIHRvIHB1dCB0aGlzIHByb3Bvc2FsIHRvZ2V0aGVy
IEFudG9uISZuYnNwOyBJIHJlYWxseSB3YW50IHRvIHNlZSB0eXBlZCB0aHJvd3MgbWFrZSBpdCBp
bnRvIFN3aWZ0IDQuJm5ic3A7IFRoaXMgd2lsbCBiZSBhIHZlcnkgbmljZSBmZWF0dXJlIHRvIGhh
dmUuPGRpdj48YnI+PC9kaXY+PGRpdj5JIG5vdGljZWQgdGhhdCB5b3UgaW5jbHVkZWQgSm9lIEdy
b2Zm4oCZcyBpZGVhIG9mIHJlcGxhY2luZyBgcmV0aHJvd3NgIGJ5IG1ha2luZyBldmVyeSBmdW5j
dGlvbiBoYXZlIGFuIGVycm9yIHR5cGUgd2hpY2ggaXMgYnkgZGVmYXVsdCBgTmV2ZXJgIGZvciBu
b24tdGhyb3dpbmcgZnVuY3Rpb25zIGFuZCBgRXJyb3JgIGZvciB0aHJvd2luZyBmdW5jdGlvbnMg
dGhhdCBkbyBub3Qgc3BlY2lmeSBhbiBlcnJvciB0eXBlLiAmbmJzcDs8L2Rpdj48ZGl2Pjxicj48
L2Rpdj48ZGl2Pkkgd2FudCB0byB1cmdlIHlvdSB0byBjb25zaWRlciB1cGRhdGluZyB0aGUgcHJv
cG9zYWwgdG8gdGFrZSB0aGlzIGRpcmVjdGlvbiBub3cgcmF0aGVyIHRoYW4gbGF0ZXIuJm5ic3A7
IFRoaXMgaXMgYSBicmVha2luZyBjaGFuZ2Ugd2hpY2ggbWVhbnMgdGhlIGxvbmdlciB3ZSB3YWl0
IHRoZSBoYXJkZXIgaXQgaXMgdG8ganVzdGlmeS4mbmJzcDsgSW4gZmFjdCwgSSB0aGluayBpbmNv
cnBvcmF0aW5nIHRoZSBicmVha2luZyBjaGFuZ2UgY291bGQgaW5jcmVhc2UgdGhlIGNoYW5jZXMg
b2YgaXQgYmVpbmcgYWNjZXB0ZWQgZm9yIFN3aWZ0IDQuJm5ic3A7IFdpdGhvdXQgdGhhdCBpdCBp
cyBhIHB1cmVseSBhZGRpdGl2ZSBjaGFuZ2UgYW5kIHRob3NlIGFyZSBub3QgYmVpbmcgZ2l2ZW4g
cHJpb3JpdHkgaW4gdGhlIFN3aWZ0IDQgcmVsZWFzZS48L2Rpdj48L2Rpdj48L2Rpdj48L2Jsb2Nr
cXVvdGU+PGRpdj48YnI+PC9kaXY+PC9zcGFuPjxkaXY+U2Vjb25kZWQuPC9kaXY+PGRpdj5XaXRo
IHR5cGVkIHRocm93aW5nIGZ1bmN0aW9uIHBhcmFtZXRlcnMsIGl0IG1ha2VzIGEgbG90IG9mIHNl
bnNlIHRvIGJlIGFibGUgdG8gc3BlY2lmeSB0aGUgcmV0aHJvd24gdHlwZSwgYmFzZWQgb24gdGhl
IGZ1bmN0aW9uIGdpdmVuIGFzIHBhcmFtZXRlci48YnI+PC9kaXY+PC9kaXY+PC9kaXY+PC9ibG9j
a3F1b3RlPjwvZGl2Pjxicj48L2Rpdj4=" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0" class="gmail_msg">​</div></div></div>
_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div></div>