Control.Arrow: Why "let (a,b) = (first,second)" fails?
<p>What I want is to write something like this:</p>

<p><code>let (a,b) = if *condition* then (first, second) else (second, first)</code></p>

<p>I found out that I cannot write even this:</p>

<p><code>let (a,b) = (first,second)</code></p>

<p>It fails with an error:</p>

<pre><code> &lt;interactive&gt;:7:5:                                                                                                                          
Could not deduce (Arrow a0)                                                                                                             
from the context (Arrow a)
  bound by the inferred type for `a':
             Arrow a =&gt; a b c -&gt; a (b, d) (c, d)
  at &lt;interactive&gt;:7:5-26
The type variable `a0' is ambiguous
When checking that `a' has the inferred type
  a :: forall (a :: * -&gt; * -&gt; *) b c d.
       Arrow a =&gt;
       a b c -&gt; a (b, d) (c, d)
Probable cause: the inferred type is ambiguous

&lt;interactive&gt;:7:5:
Could not deduce (Arrow a0)
from the context (Arrow a)
  bound by the inferred type for `b':
             Arrow a =&gt; a b c -&gt; a (d, b) (d, c)
  at &lt;interactive&gt;:7:5-26
The type variable `a0' is ambiguous
When checking that `b' has the inferred type
  b :: forall (a :: * -&gt; * -&gt; *) b c d.
       Arrow a =&gt;
       a b c -&gt; a (d, b) (d, c)
Probable cause: the inferred type is ambiguous
</code></pre>