<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 22, 2017, at 7:10 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="">How about this:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px" class=""><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;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important" class="">func bypassRethrows<E: Error>(_ f: () throws(E) -> ()) throws(E) {
if let e = (MyError() as Error) as? E {
throw e
}
}
</code></pre><p style="margin:0px 0px 1.2em!important" class="">I obviously can’t “test” this right now, but should work?</p><div class=""><br class=""></div></div></div></div></blockquote><div><br class=""></div><div>No because there are many types that conform to `Error` but are not `E` and the signature says you only throw `E`. You have no way to get an instance of `E` except by catching one thrown by `f` because `Error` does not have any initializers and you don’t have any visibility to anything that provides an `E` in any way except when `f` throws.</div><div><br class=""></div><div>I am hoping to have time to write up my analysis of generic rethrowing functions later today. There are some very interesting tradeoffs we need to make.</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="">2017-02-22 3:42 GMT+03:00 Colin Barrett <<a href="mailto:colin@springsandstruts.com" target="_blank" class="">colin@springsandstruts.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:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class=""><div class="gmail_quote"><span class="gmail-"><div class="">On Sun, Feb 19, 2017 at 2:34 PM Anton Zhilin via swift-evolution <<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div class="gmail-m_-2809003803879918586gmail_msg"><div class="gmail-m_-2809003803879918586m_-5940626585113039258markdown-here-wrapper gmail-m_-2809003803879918586gmail_msg"><p style="margin:0px 0px 1.2em" class="gmail-m_-2809003803879918586gmail_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-m_-2809003803879918586gmail_msg">rethrows</code>.<br class="gmail-m_-2809003803879918586gmail_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-m_-2809003803879918586gmail_msg">rethrows</code> has semantic information that function itself does not throw—it would be lost.</p></div></div></blockquote></span><div class="">That's not true. Parametric polymorphism guarantees that rethrows and polymorphic throw are the same. </div><div class=""><br class=""></div><div class="">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 -> A'' and furthermore that it is the identity function.</div><div class=""><br class=""></div><div class="">The intuition behind this is that you (meaning the fiction; imagine being a function!) cannot construct your own value of "A" since you don't have any information about what "A" is. The only place to get an "A" is from your argument.</div></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:PGRpdj5Ib3cgYWJvdXQgdGhpczo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PmBgYDwvZGl2Pjxk
aXY+ZnVuYyBieXBhc3NSZXRocm93cyZsdDtFOiBFcnJvciZndDsoXyBmOiAoKSB0aHJvd3MoRSkg
LSZndDsgKCkpIHRocm93cyhFKSB7PC9kaXY+PGRpdj48ZGl2PiZuYnNwOyAmbmJzcDsgaWYgbGV0
IGUgPSAoTXlFcnJvcigpIGFzIEVycm9yKSBhcz8gRSB7PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7
ICZuYnNwOyAmbmJzcDsgdGhyb3cgZTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyB9PC9kaXY+PGRp
dj59PC9kaXY+PGRpdj5gYGA8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2Pkkgb2J2aW91c2x5IGNh
bid0ICJ0ZXN0IiB0aGlzIHJpZ2h0IG5vdywgYnV0IHNob3VsZCB3b3JrPzwvZGl2PjxkaXY+PGRp
dj48YnI+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj4y
MDE3LTAyLTIyIDM6NDIgR01UKzAzOjAwIENvbGluIEJhcnJldHQgPHNwYW4gZGlyPSJsdHIiPiZs
dDs8YSBocmVmPSJtYWlsdG86Y29saW5Ac3ByaW5nc2FuZHN0cnV0cy5jb20iIHRhcmdldD0iX2Js
YW5rIj5jb2xpbkBzcHJpbmdzYW5kc3RydXRzLmNvbTwvYT4mZ3Q7PC9zcGFuPjo8YmxvY2txdW90
ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46IDBweCAwcHggMHB4IDAuOGV4OyBi
b3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYigyMDQsIDIwNCwgMjA0KTsgcGFkZGluZy1sZWZ0OiAx
ZXg7Ij48ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX3F1b3RlIj48c3BhbiBjbGFzcz0iZ21haWwtIj48
ZGl2Pk9uIFN1biwgRmViIDE5LCAyMDE3IGF0IDI6MzQgUE0gQW50b24gWmhpbGluIHZpYSBzd2lm
dC1ldm9sdXRpb24gJmx0OzxhIGhyZWY9Im1haWx0bzpzd2lmdC1ldm9sdXRpb25Ac3dpZnQub3Jn
IiB0YXJnZXQ9Il9ibGFuayI+c3dpZnQtZXZvbHV0aW9uQHN3aWZ0Lm9yZzwvYT4mZ3Q7IHdyb3Rl
Ojxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxfcXVvdGUiIHN0eWxlPSJtYXJnaW46
IDBweCAwcHggMHB4IDAuOGV4OyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYigyMDQsIDIwNCwg
MjA0KTsgcGFkZGluZy1sZWZ0OiAxZXg7Ij48ZGl2IGNsYXNzPSJnbWFpbC1tXy0yODA5MDAzODAz
ODc5OTE4NTg2Z21haWxfbXNnIj48ZGl2IGNsYXNzPSJnbWFpbC1tXy0yODA5MDAzODAzODc5OTE4
NTg2bV8tNTk0MDYyNjU4NTExMzAzOTI1OG1hcmtkb3duLWhlcmUtd3JhcHBlciBnbWFpbC1tXy0y
ODA5MDAzODAzODc5OTE4NTg2Z21haWxfbXNnIj48cCBzdHlsZT0ibWFyZ2luOiAwcHggMHB4IDEu
MmVtOyIgY2xhc3M9ImdtYWlsLW1fLTI4MDkwMDM4MDM4Nzk5MTg1ODZnbWFpbF9tc2ciPk5vdyB0
aGF0IEkgdGhpbmsgYWJvdXQgaXQsIGdlbmVyaWMgdGhyb3dzIGRvZXMgbm90IGV4YWN0bHkgY292
ZXIgPGNvZGUgc3R5bGU9ImZvbnQtc2l6ZTogMC44NWVtOyBmb250LWZhbWlseTogY29uc29sYXMs
IGluY29uc29sYXRhLCBjb3VyaWVyLCBtb25vc3BhY2U7IG1hcmdpbjogMHB4IDAuMTVlbTsgcGFk
ZGluZzogMHB4IDAuM2VtOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGJvcmRlcjogMXB4IHNvbGlk
IHJnYigyMzQsIDIzNCwgMjM0KTsgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0OCwgMjQ4LCAyNDgp
OyBib3JkZXItcmFkaXVzOiAzcHg7IGRpc3BsYXk6IGlubGluZTsiIGNsYXNzPSJnbWFpbC1tXy0y
ODA5MDAzODAzODc5OTE4NTg2Z21haWxfbXNnIj5yZXRocm93czwvY29kZT4uPGJyIGNsYXNzPSJn
bWFpbC1tXy0yODA5MDAzODAzODc5OTE4NTg2Z21haWxfbXNnIj5GaXJzdGx5LCA8Y29kZSBzdHls
ZT0iZm9udC1zaXplOiAwLjg1ZW07IGZvbnQtZmFtaWx5OiBjb25zb2xhcywgaW5jb25zb2xhdGEs
IGNvdXJpZXIsIG1vbm9zcGFjZTsgbWFyZ2luOiAwcHggMC4xNWVtOyBwYWRkaW5nOiAwcHggMC4z
ZW07IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgYm9yZGVyOiAxcHggc29saWQgcmdiKDIzNCwgMjM0
LCAyMzQpOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ4LCAyNDgsIDI0OCk7IGJvcmRlci1yYWRp
dXM6IDNweDsgZGlzcGxheTogaW5saW5lOyIgY2xhc3M9ImdtYWlsLW1fLTI4MDkwMDM4MDM4Nzk5
MTg1ODZnbWFpbF9tc2ciPnJldGhyb3dzPC9jb2RlPiBoYXMgc2VtYW50aWMgaW5mb3JtYXRpb24g
dGhhdCBmdW5jdGlvbiBpdHNlbGYgZG9lcyBub3QgdGhyb3figJRpdCB3b3VsZCBiZSBsb3N0Ljwv
cD48L2Rpdj48L2Rpdj48L2Jsb2NrcXVvdGU+PC9zcGFuPjxkaXY+VGhhdCdzIG5vdCB0cnVlLiBQ
YXJhbWV0cmljIHBvbHltb3JwaGlzbSBndWFyYW50ZWVzIHRoYXQgcmV0aHJvd3MgYW5kIHBvbHlt
b3JwaGljIHRocm93IGFyZSB0aGUgc2FtZS4mbmJzcDs8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2
PkZvciBleGFtcGxlLCB5b3UgY2FuIHByb3ZlIHRoYXQgYXMgYSBjb25zZXF1ZW5jZSBvZiBwYXJh
bWV0cmljaXR5IHRoYXQgdGhlcmUgaXMgb25seSBvbmUgKHB1cmUpIGZ1bmN0aW9uIGluIHRoZSBv
ZiB0aGUgc2V0IG9mIGFsbCBmdW5jdGlvbnMgd2l0aCB0aGUgdHlwZSBgYGZvcmFsbCBBLiBBIC0m
Z3Q7IEEnJyBhbmQgZnVydGhlcm1vcmUgdGhhdCBpdCBpcyB0aGUgaWRlbnRpdHkgZnVuY3Rpb24u
PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGUgaW50dWl0aW9uIGJlaGluZCB0aGlzIGlzIHRo
YXQgeW91IChtZWFuaW5nIHRoZSBmaWN0aW9uOyBpbWFnaW5lIGJlaW5nIGEgZnVuY3Rpb24hKSBj
YW5ub3QgY29uc3RydWN0IHlvdXIgb3duIHZhbHVlIG9mICJBIiBzaW5jZSB5b3UgZG9uJ3QgaGF2
ZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCAiQSIgaXMuIFRoZSBvbmx5IHBsYWNlIHRvIGdl
dCBhbiAiQSIgaXMgZnJvbSB5b3VyIGFyZ3VtZW50LjwvZGl2PjwvZGl2PjwvZGl2PjwvYmxvY2tx
dW90ZT48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4=" 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>