title: making top-level patterns monomorphic
body: <pre><code>import Control.Lens
  
  -- is there a way I can write top-level definitions
  -- in an arbitrary order like
  px = proto &amp; _1 %~ asTypeOf '2'
  py = proto &amp; _2 %~ asTypeOf "2"
  proto = (undefined, undefined)
  
  -- but have types inferred like the following:
  (qx,qy,qroto) = case (undefined, undefined) of
    qxy -&gt; (qxy &amp; _1 %~ asTypeOf '2',
            qxy &amp; _2 %~ asTypeOf "2",
            qxy)
  </code></pre>
  
  <p>I get the desired <code>qroto :: (Char, [Char])</code>, but <code>proto :: (t, t1)</code> is too general. More importantly, this leads to <code>px :: (Char, t)</code> instead of <code>qx :: (Char, [Char])</code>.</p>
  
  <p>The larger problem is that I am trying to make it possible to reduce the type annotations needed with the third argument to <a href="http://hackage.haskell.org/package/HList-0.3.4.1/docs/Data-HList-Variant.html#mkVariant" rel="nofollow">Data.HList.Variant.mkVariant</a>.</p>