<p dir="auto">Is there any particular reason to have <code class="notranslate">product</code> return different values depending on the number of iterators provided?</p>
<p dir="auto">Demo</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="julia&gt; Base.iteratorsize(Base.product(1:2))
Base.HasShape()

julia&gt; Base.iteratorsize(Base.product(1:2, 1:2))
Base.HasLength()"><pre class="notranslate"><code class="notranslate">julia&gt; Base.iteratorsize(Base.product(1:2))
Base.HasShape()

julia&gt; Base.iteratorsize(Base.product(1:2, 1:2))
Base.HasLength()
</code></pre></div>
<p dir="auto">This currently happens because <code class="notranslate">Base.product(itr)</code> calls the <code class="notranslate">Zip1</code> constructor which has a different behaviour.</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="julia&gt; Base.product(1:2)
Base.Zip1{UnitRange{Int64}}(1:2)

julia&gt; Base.product(1:2, 1:2)
Base.Prod2{UnitRange{Int64},UnitRange{Int64}}(1:2,1:2)"><pre class="notranslate"><code class="notranslate">julia&gt; Base.product(1:2)
Base.Zip1{UnitRange{Int64}}(1:2)

julia&gt; Base.product(1:2, 1:2)
Base.Prod2{UnitRange{Int64},UnitRange{Int64}}(1:2,1:2)
</code></pre></div>
<p dir="auto">At the cost of some code duplication the alternative would be to implement a <code class="notranslate">Prod1</code> type and add the required behaviour instead of calling the <code class="notranslate">Zip1</code> constructor.</p>
<p dir="auto">(this is on master)</p>
<p dir="auto">Right now any <code class="notranslate">Pkg.add</code> can lead to a downgrade of some other installed package. That seems like a bad user experience: when I add a new package, I probably don't want my other packages to revert to an old version.</p>
<p dir="auto">I think a better solution would be if <code class="notranslate">Pkg.add</code> detects that it needs to do some package downgrades, it should show the user the list of packages that would be downgraded and then confirm whether the user actually really wants to proceed or not. And then there could be a <code class="notranslate">force</code> argument to <code class="notranslate">Pkg.add</code> that would just go ahead without user confirmation.</p>
<p dir="auto">The same logic might also apply to some other package commands. Probably <code class="notranslate">Pkg.clone</code>. Not sure about <code class="notranslate">Pkg.update</code>...</p>