<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=""><div class="">what if OneOf<A, A>?</div><div class=""><br class=""></div><div class="">duplicate variable compile warning?</div><br class=""><div class=""><blockquote type="cite" class=""><div class="">在 2016年7月1日,20:59,Adrian Z. <<a href="mailto:notifications@github.com" class="">notifications@github.com</a>> 写道:</div><br class="Apple-interchange-newline"><div class=""><p class="">Just one simple thing to add:</p><ul class=""><li class="">If <code class="">...T</code> equals 10 then <code class=""><...T, U></code> = 10 + 1 = 11 types</li><li class="">If <code class="">...U</code> equals 17 then <code class=""><T, ...U></code> = 1 + 17 = 18 types</li><li class="">If <code class="">...T</code> equals 20 and <code class="">...U</code>equals 22 then <code class=""><...T, ...U></code> = 20 + 22 = 42 types</li></ul><p class="" style="font-size: small; color: rgb(102, 102, 102);">—<br class="">You are receiving this because you were mentioned.<br class="">Reply to this email directly, <a href="https://github.com/apple/swift-evolution/pull/404#issuecomment-229940122" class="">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe/ABsfmhH9yasaWK8vAs17DGXWHV54QuCkks5qRQ9KgaJpZM4JC7-2" class="">mute the thread</a>.<img alt="" height="1" src="https://github.com/notifications/beacon/ABsfmkBzQ806lGj4BhEPjCfF9CGLNWbWks5qRQ9KgaJpZM4JC7-2.gif" width="1" class=""></p><div class=""></div></div></blockquote></div><blockquote type="cite" class=""><div class=""><blockquote type="cite" class=""><div class=""><div class=""><br class=""></div></div></blockquote></div><div><blockquote type="cite" class=""><div class="">在 2016年7月1日,21:33,Cao Jiannan <<a href="mailto:frogcjn@163.com" class="">frogcjn@163.com</a>> 写道:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I can't compile your code. I'm really not sure your code will pass the complex generic check 🙃</div><div class=""><br class=""></div><div class="">Union version more complex or generic version?<br class=""></div><div class="">I think union version is more normal.</div><blockquote type="cite" class=""><div class=""><blockquote class=""><p class="">For example:</p><p class="">typealias ABC = A | B | C</p><p class="">typealias ABCD = ABC | D</p><p class="">we just use an existed type ABC to construct ABCD</p><p class="">But how about generic wrap?</p></blockquote><p class="">Bikeshedding:</p><div class="highlight highlight-source-swift"><pre class=""><span class="pl-c">// we generate the boundary with `A | B` or directly OneOf<A, B></span>
<span class="pl-k">enum</span> OneOf<span class="pl-k"><...</span>T<span class="pl-k">></span> {
<span class="pl-k">...</span><span class="pl-k">case</span> $#(T)
<span class="pl-c">// Bikeshedding variadic enum casses:</span>
<span class="pl-c">// we might need an index to set the value?</span>
<span class="pl-k">init</span>(index: <span class="pl-c1">Int</span>, value: T) {
<span class="pl-k">self</span> <span class="pl-k">=</span> <span class="pl-k">.</span>$index(value)
}
}
<span class="pl-c">/// Usage:</span>
<span class="pl-c">/// A | B | C == OneOf<A, B, C></span>
<span class="pl-k">func</span> <span class="pl-en">|</span><T, U>(_: T<span class="pl-k">.</span><span class="pl-k">Type</span>, _: U<span class="pl-k">.</span><span class="pl-k">Type</span>) <span class="pl-k">-></span> OneOf<T, U>.Type {
<span class="pl-c">// I believe the usage of `type` like this was prposed by Joe Groff</span>
<span class="pl-c">// I also use the proposal to remove `.self` magic here</span>
<span class="pl-k">return</span> OneOf<span class="pl-k"><</span>T, U<span class="pl-k">></span>
}
<span class="pl-c">// Here is how to merge OneOf into a single dimension</span>
<span class="pl-k">func</span> <span class="pl-en">|</span><<span class="pl-k">...</span>T, U>(_: OneOf<span class="pl-k"><...</span>T<span class="pl-k">>.</span><span class="pl-k">Type</span>, _: U<span class="pl-k">.</span><span class="pl-k">Type</span>) <span class="pl-k">-></span> OneOf<...T, U>.Type {
<span class="pl-c">// Copy and merge types into the new `OneOf` type</span>
<span class="pl-k">return</span> OneOf<span class="pl-k"><...</span>T, U<span class="pl-k">></span>
}
<span class="pl-k">func</span> <span class="pl-en">|</span><T, <span class="pl-k">...</span>U>(_: T<span class="pl-k">.</span><span class="pl-k">Type</span>, _: OneOf<span class="pl-k"><...</span>U<span class="pl-k">>.</span><span class="pl-k">Type</span>) <span class="pl-k">-></span> OneOf<T, ...U>.Type {
<span class="pl-c">// Copy and merge types into the new `OneOf` type</span>
<span class="pl-k">return</span> OneOf<span class="pl-k"><</span>T, <span class="pl-k">...</span>U<span class="pl-k">></span>
}
<span class="pl-k">func</span> <span class="pl-en">|</span><<span class="pl-k">...</span>T, <span class="pl-k">...</span>U>(_: OneOf<span class="pl-k"><...</span>T<span class="pl-k">>.</span><span class="pl-k">Type</span>, _: OneOf<span class="pl-k"><...</span>U<span class="pl-k">>.</span><span class="pl-k">Type</span>) <span class="pl-k">-></span> OneOf<...T, ...U>.Type {
<span class="pl-c">// Copy and merge types into the new `OneOf` type</span>
<span class="pl-k">return</span> OneOf<span class="pl-k"><...</span>T, <span class="pl-k">...</span>U<span class="pl-k">></span>
}</pre></div><p class="">Your example will become:</p><div class="highlight highlight-source-swift"><pre class=""><span class="pl-k">typealias</span> ABC <span class="pl-k">=</span> A <span class="pl-k">|</span> B <span class="pl-k">|</span> C <span class="pl-c">// or OneOf<A, B, C></span>
<span class="pl-k">typealias</span> ABCD <span class="pl-k">=</span> ABC <span class="pl-k">|</span> D <span class="pl-c">// merging lhs OneOf with D to OneOf<A, B, C, D></span></pre></div><p class="">Mission accomplished.</p></div><div class=""><br class=""></div><div class=""><blockquote type="cite" class=""><div class="">在 2016年7月1日,17:06,Cao Jiannan <<a href="mailto:frogcjn@163.com" class="">frogcjn@163.com</a>> 写道:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><a href="https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md" class="">https://github.com/frogcjn/swift-evolution/blob/master/proposals/xxxx-union-type.md</a><div class=""><br class=""></div><div class=""><div class="">Hi,</div><div class=""><br class=""></div><div class="">I'm now officially proposal the union type feature for Swift. Please see:</div><div class=""><br class=""></div><br class="Apple-interchange-newline"><a href="https://github.com/apple/swift/commit/eb7311de065df7ea332cdde8782cb44f9f4a5121" class="">https://github.com/apple/swift/commit/eb7311de065df7ea332cdde8782cb44f9f4a5121</a></div><div class=""><h2 style="box-sizing: border-box; margin-top: 1em; margin-bottom: 16px; line-height: 1.225; font-size: 1.75em; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(238, 238, 238); color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; background-color: rgb(255, 255, 255);" class="">Introduction</h2><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);" class="">Add union type grammar, represents the type which is one of other types.</p><div class="highlight highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'Segoe UI', Arial, freesans, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; font-size: 16px; background-color: rgb(255, 255, 255);"><pre style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(247, 247, 247); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal;" class=""><span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> stringOrURL: <span class="pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span> <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">|</span> URL <span class="pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> <span class="pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="pl-pds" style="box-sizing: border-box;">"</span><a href="https://www.apple.com/" class="">https://www.apple.com</a><span class="pl-pds" style="box-sizing: border-box;">"</span></span></pre></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">I would be thankful if someone support this idea and give some advice. Thanks!</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">--</div></div><div class="">Jiannan</div><div class=""><br class=""></div><div class=""><br class=""></div></div></div></blockquote></div><br class=""></blockquote></div></div></blockquote></div><br class=""></blockquote></body></html>