<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div><br></div><div>Am 18.04.2016 um 08:16 schrieb Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com">gribozavr@gmail.com</a>&gt;:<br><br></div><blockquote type="cite"><div><span>On Sun, Apr 17, 2016 at 11:14 PM, Thorsten Seitz &lt;<a href="mailto:tseitz42@icloud.com">tseitz42@icloud.com</a>&gt; wrote:</span><br><blockquote type="cite"><span>Preventing indices of one collection being used by another collection can be done by using path dependent types like in Scala.</span><br></blockquote><blockquote type="cite"><span></span><br></blockquote><blockquote type="cite"><span>Then 'i' would have type a.Index (where 'a' is the instance!) and therefore b[i] would not typecheck as it would require an index of type b.Index</span><br></blockquote><span></span><br><span>This is an interesting concept! &nbsp;Would this work with slices? &nbsp;You</span><br><span>should be able to use indices from slices with the base collection,</span><br><span>and vice-versa (when indices are in range).</span><br></div></blockquote><div><br></div>Good point!<div><br></div><div>I just tried the following on <a href="http://scastie.org">scastie.org</a>:</div><div><br></div><div><div class="line number6 index5 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">class</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Coll(</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">elements</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">List[Int]) {</code></span></font></div><div class="line number7 index6 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number8 index7 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">case</code>&nbsp;<code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">class</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index(</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">value</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Int)</code></span></font></div><div class="line number9 index8 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number10 index9 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">def</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">firstIndex</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index(</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">0</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">)</code></span></font></div><div class="line number11 index10 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number12 index11 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">def</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">get(index</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index)&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">elements(index.value)</code></span></font></div><div class="line number13 index12 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number14 index13 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">def</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">slice(start</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index)&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">new</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Slice(start.value)</code></span></font></div><div class="line number15 index14 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number16 index15 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">class</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Slice(</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">start</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Int) {</code></span></font></div><div class="line number17 index16 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">def</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">firstIndex</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index(start)</code></span></font></div><div class="line number18 index17 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">def</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">get(index</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">:</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Index)&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">elements(index.value)</code></span></font></div><div class="line number19 index18 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">}</code></span></font></div><div class="line number20 index19 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number21 index20 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; background-color: rgba(255, 255, 255, 0);"><font face="UICTFontTextStyleTallBody">}</font></code></div><div class="line number22 index21 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number23 index22 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">object</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Main&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">extends</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">App {</code></span></font></div><div class="line number24 index23 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number25 index24 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">a&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">new</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Coll(List(</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">1</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">,&nbsp;</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">2</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">,&nbsp;</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">3</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">))</code></span></font></div><div class="line number26 index25 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">b&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">new</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">Coll(List(</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">1</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">,&nbsp;</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">2</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">,&nbsp;</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">3</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">))</code></span></font></div><div class="line number27 index26 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number28 index27 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">i&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">a.firstIndex</code></span></font></div><div class="line number29 index28 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number30 index29 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">a.get(i)</code></span></font></div><div class="line number31 index30 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala comments" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">// b.get(i) // type error</code></span></font></div><div class="line number32 index31 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number33 index32 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">s&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">a.slice(a.firstIndex)</code></span></font></div><div class="line number34 index33 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">s.get(a.firstIndex)&nbsp;</code><code class="scala comments" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">// allowed!</code></span></font></div><div class="line number35 index34 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><span style="background-color: rgba(255, 255, 255, 0);">&nbsp;</span></div><div class="line number36 index35 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">val</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">s</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">2</code>&nbsp;<code class="scala keyword" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; font-weight: bold !important;">=</code>&nbsp;<code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">b.slice(b.firstIndex)</code></span></font></div><div class="line number37 index36 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">s</code><code class="scala value" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">2</code><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">.get(b.firstIndex)</code></span></font></div><div class="line number38 index37 alt1" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><font face="UICTFontTextStyleTallBody"><span style="background-color: rgba(255, 255, 255, 0);"><code class="scala spaces" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">&nbsp;&nbsp;</code><code class="scala comments" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit;">// s2.get(a.firstIndex) // type error</code></span></font></div><div class="line number39 index38 alt2" style="margin: 0px; padding: 0px; border: 0px; outline: 0px;"><code class="scala plain" style="margin: 0px; padding: 0px; border: 0px; outline: 0px; font-style: inherit; background-color: rgba(255, 255, 255, 0);"><font face="UICTFontTextStyleTallBody">}</font></code></div></div><div><br></div><div>So it seems that having Slice as nested class (which has an implicit reference to the collection instance) results in a slice to have the same index type as its parent collection, so that it indeed works as intended.</div><div><br></div><div>Now the question is whether this would fit the design of slices in Swift and whether/how path dependent types would fit nicely into the design of Swift.</div><div><br></div><div>-Thorsten&nbsp;<br><blockquote type="cite"><div><span></span></div></blockquote></div></body></html>