Hello Will,

2010/8/11 Will Jones <w...@sacharissa.co.uk>:
> I'm trying to write a function (I'll call it `vtuple' for lack of a better
> name)
> that returns a function that itself returns multiple arguments in the form
> of a
> tuple. For example:
>
> vtuple f :: IO (Int -> (Int, ()))
> vtuple g :: IO (Int -> Int -> (Int, (Int, ())))

If we drop the IO (as pointed out by Ryan Ingram), vtuple seems weird
- the only sensible function of the type "Int -> Int -> (Int, (Int,
()))" is a function that collects its arguments and returns them in a
tuple, so it doesn't touch the input function g at all, it only cares
about g's arity.

Here's the solution:

> vtuple f = eat (arity f) `mcomp` hListToTuple

> class HListToTuple l r | l -> r where
>     hListToTuple :: l -> r
>
> instance HListToTuple HNil () where
>     hListToTuple _ = ()
>
> instance HListToTuple xs ys => HListToTuple (HCons x xs) (x,ys) where
>     hListToTuple (HCons x xs) = (x,hListToTuple xs)

Rest of the code (functions eat, arity and mcomp) is presented here:
http://paczesiowa.blogspot.com/2010/03/generalized-zipwithn.html

Regards,
Bartek Ćwikłowski
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to