<div dir="ltr"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">@noreturn func error&lt;T&gt;(msg: String = &quot;&quot;) -&gt; T {<br>    fatalError(&quot;bottom: \(msg)&quot;)<br>}<br>has to be written as<br>func error&lt;T&gt;(msg: String = &quot;&quot;) -&gt; T {<br>    fatalError(&quot;bottom: \(msg)&quot;)<br>}<br>It still returns bottom, but there is no way to say so in the declaration. The proposal just made the language less expressive!</blockquote><div><br></div><div>Do we need to? One of use cases of this feature is to prototype using unimplemented functions, i.e. lying about return type. In other cases, return type of this function should be NoReturn/Never, as well.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">You can write a foo-function that is really unintuitive:<br>func foo() -&gt; NoReturn {<br>   let x = fatalError(&quot;crash please&quot;)<br>   print(&quot;1+1=2&quot;)<br>   return x<br>}</blockquote><div><br></div><div>This is called &quot;unreachable code&quot;, and this should give the same warning as is currently given in such cases. Also you can currently create sufficiently complex unreachable code that does not trigger a warning, and nothing will change in that aspect.</div><div><br></div><div>Thinking about bottom-like behaviour, it would be a strict extension of functionality of Never, so it can be discussed later in a separate proposal.</div><div><br></div><div>- Anton</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-06-06 22:40 GMT+03:00 Michael Peternell <span dir="ltr">&lt;<a href="mailto:michael.peternell@gmx.at" target="_blank">michael.peternell@gmx.at</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
&gt; Am 06.06.2016 um 00:53 schrieb Charles Srstka &lt;<a href="mailto:cocoadev@charlessoft.com">cocoadev@charlessoft.com</a>&gt;:<br>
&gt;<br>
&gt;&gt; On Jun 5, 2016, at 5:41 PM, Michael Peternell via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt; Am 05.06.2016 um 20:26 schrieb Антон Жилин via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt;:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; The following names were suggested: NoReturn, Bottom, None, Never.<br>
&gt;&gt;&gt; I would pick None, because it looks like opposite to Any and fits nicely in generic types.<br>
&gt;&gt;<br>
&gt;&gt; I would like to call the type `Void`. `Void` is a type with zero possible values. The current `Void` would have to be renamed to `Unit`, the data type with exactly one possible value. Less C, More Haskell :) But wait, that&#39;s not really Haskell-ish, and it&#39;s not C-ish either.<br>
&gt;<br>
&gt; That is the most confusing possible thing that this could possibly be called. Seeing a Void return will cause anyone coming from a C, C++, ObjC, etc. background to think of something that is definitely *not* a no-return function.<br>
<br>
</span>I agree. For this reason, my email continued after that paragraph. I deliberately ended the last sentence of that paragraph with &quot;But wait, that&#39;s not really...&quot;<br>
<br>
There is a really really good reason why Haskell doesn&#39;t have a named &quot;bottom type&quot; like &quot;None&quot; or &quot;Void&quot;. The bottom type has type `forall a. a`, corresponding to the mathematical fact that from &quot;false&quot; follows anything. Assigning a bottom type to a variable makes only sense in Haskell, because it uses lazy evaluation. With strict evaluation, a bottom type is just confusing at best. And a `Nothing` type corresponds to Haskell&#39;s `Void` type, not to its bottom type - a really exotic type that is seldom used. Its not consistent to have a @noreturn-function return `Nothing` instead, because `Nothing` that&#39;s not a proper type. You can write a foo-function that is really unintuitive:<br>
<span class=""><br>
func foo() -&gt; NoReturn {<br>
   let x = fatalError(&quot;crash please&quot;)<br>
   print(&quot;1+1=2&quot;)<br>
   return x<br>
}<br>
<br>
</span>Shouldn&#39;t we all just try to understand the rationale for the current language behavior before we try to propose changes?<br>
<br>
E.g. with the proposal, the following function:<br>
<br>
@noreturn func error&lt;T&gt;(msg: String = &quot;&quot;) -&gt; T {<br>
    fatalError(&quot;bottom: \(msg)&quot;)<br>
}<br>
<br>
has to be written as<br>
<br>
func error&lt;T&gt;(msg: String = &quot;&quot;) -&gt; T {<br>
    fatalError(&quot;bottom: \(msg)&quot;)<br>
}<br>
<br>
It still returns bottom, but there is no way to say so in the declaration. The proposal just made the language less expressive!<br>
<br>
See also:<br>
<a href="https://en.wikibooks.org/wiki/Haskell/Denotational_semantics" rel="noreferrer" target="_blank">https://en.wikibooks.org/wiki/Haskell/Denotational_semantics</a><br>
for a more in-depth explanation why &quot;bottom&quot; is not an ordinary type with a name.<br>
<span class="HOEnZb"><font color="#888888"><br>
-Michael<br>
<br>
</font></span></blockquote></div><br></div>