Hi Ryan,<br><br>Thanks for the reply. The specification I&#39;ve given is just to illustrate the kind of relationship I&#39;m trying to establish between the types of the argument and the result. In reality the type of the argument function is something a little more usable; you could generalise it with type families vis:<br>

<br>class HasDual t where<br>  type Dual t<br><br>class VTuple ia ir a r | r -&gt; a where<br>  vtuple :: (ia -&gt; ir) -&gt; IO (a -&gt; r)<br><br>-- m is some monad.<br>instance (HasDual t, Dual t ~ dual) =&gt; VTuple dual (m a) t (t, ())<br>

<br>etc.<br><br>I hope that clears things up; to be honest I&#39;m not sure it&#39;s relevant -- the more I look at it the more I&#39;m stumped.<br><br>Cheers,<br>Will<br><br><div class="gmail_quote">On Wed, Aug 11, 2010 at 7:08 PM, Ryan Ingram <span dir="ltr">&lt;<a href="mailto:ryani.spam@gmail.com">ryani.spam@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">There&#39;s no (safe) way to go from<br>
<br>
a -&gt; IO b<br>
<br>
to<br>
<br>
IO (a -&gt; b)<br>
<br>
which is part of what vtuple does.<br>
<br>
Consider<br>
<br>
foo :: Int -&gt; IO String<br>
foo 0 = return &quot;zero&quot;<br>
foo _ = launchMissles &gt;&gt; return &quot;fired!&quot;<br>
<br>
How would you implement foo2 :: IO (Int -&gt; String) with the same behavior?<br>
<br>
You can&#39;t; you would somehow need to know the argument the function<br>
was called at, and when it was going to be called, to implement foo2.<br>
<br>
So I think you need a better specification!<br>
<font color="#888888"><br>
  -- ryan<br>
</font><div><div></div><div class="h5"><br>
On Wed, Aug 11, 2010 at 8:50 AM, Will Jones &lt;<a href="mailto:will@sacharissa.co.uk">will@sacharissa.co.uk</a>&gt; wrote:<br>
&gt; Hi all,<br>
&gt;<br>
&gt; I&#39;m trying to write a function (I&#39;ll call it `vtuple&#39; for lack of a better<br>
&gt; name)<br>
&gt; that returns a function that itself returns multiple arguments in the form<br>
&gt; of a<br>
&gt; tuple. For example:<br>
&gt;<br>
&gt;&gt; {-# LANGUAGE FlexibleInstances #-}<br>
&gt;&gt; {-# LANGUAGE FunctionalDependencies #-}<br>
&gt;&gt; {-# LANGUAGE MultiParamTypeClasses #-}<br>
&gt;<br>
&gt;&gt; f :: Int -&gt; IO ()<br>
&gt;&gt; f = undefined<br>
&gt;<br>
&gt;&gt; g :: Int -&gt; Int -&gt; IO ()<br>
&gt;&gt; g = undefined<br>
&gt;<br>
&gt;&gt; h :: Int -&gt; Int -&gt; Int -&gt; IO ()<br>
&gt;&gt; h = undefined<br>
&gt;<br>
&gt; vtuple f :: IO (Int -&gt; (Int, ()))<br>
&gt; vtuple g :: IO (Int -&gt; Int -&gt; (Int, (Int, ())))<br>
&gt;<br>
&gt; I&#39;ve tried to type vtuple using a type class; my current effort is something<br>
&gt; like:<br>
&gt;<br>
&gt;&gt; class VTuple ia ir a r | r -&gt; a, a -&gt; ia where<br>
&gt;&gt;   vtuple :: (ia -&gt; ir) -&gt; IO (a -&gt; r)<br>
&gt;<br>
&gt;&gt; instance VTuple Int (IO ()) Int (Int, ()) where<br>
&gt;&gt; --vtuple :: (Int -&gt; IO ()) -&gt; IO (Int -&gt; (Int, ()))<br>
&gt;&gt;   vtuple = undefined<br>
&gt;<br>
&gt;&gt; instance VTuple ia ir a r<br>
&gt;&gt;       =&gt; VTuple Int (ia -&gt; ir) Int (a -&gt; (Int, r)) where<br>
&gt;<br>
&gt;&gt; --vtuple :: (Int -&gt; ia -&gt; ir) -&gt; IO (Int -&gt; a -&gt; (Int, r))<br>
&gt;&gt;   vtuple = undefined<br>
&gt;<br>
&gt; But this is problematic, since arrows creep in:<br>
&gt;<br>
&gt; For one argument (fine):<br>
&gt;   vtuple :: (Int -&gt; IO ()) -&gt; IO (Int -&gt; (Int, ()))<br>
&gt;<br>
&gt;&gt; vf :: IO (Int -&gt; (Int, ()))<br>
&gt;&gt; vf = vtuple f<br>
&gt;<br>
&gt; For two arguments (also fine):<br>
&gt;   vtuple  :: (Int -&gt; Int -&gt; IO ())<br>
&gt;           -&gt; IO (Int -&gt; Int -&gt; (Int, (Int, ())))<br>
&gt;<br>
&gt;&gt; vg :: IO (Int -&gt; Int -&gt; (Int, (Int, ())))<br>
&gt;&gt; vg = vtuple g<br>
&gt;<br>
&gt; For three (noooo!):<br>
&gt;   vtuple  :: (Int -&gt; Int -&gt; IO ())<br>
&gt;           -&gt; IO (Int -&gt; Int -&gt; (Int, (Int -&gt; (Int32, (Int32, ())))))<br>
&gt;<br>
&gt; And so on. I&#39;ve thought about it and it seems impossible to solve this<br>
&gt; problem<br>
&gt; -- you keep needing to ``split&#39;&#39; the function type one arrow further on. Is<br>
&gt; this a job for Template Haskell or is there a solution I&#39;m missing here?<br>
&gt; Note<br>
&gt; that I&#39;d also like to use types other than Int, but I don&#39;t think this is<br>
&gt; the<br>
&gt; primary complication here (touch wood).<br>
&gt;<br>
&gt; Any help much appreciated, thanks,<br>
&gt; Will<br>
&gt;<br>
</div></div><div><div></div><div class="h5">&gt; _______________________________________________<br>
&gt; Haskell-Cafe mailing list<br>
&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br>