
Using fundeps I came up with this:
class T funs arg res | funs -> arg res, arg res -> funs where
tuple :: funs -> arg -> res
instance (a ~ a0, a0 ~ a1) => T (a0 -> b, a1 -> c) a (b, c) where
tuple (f, g) a = (f a, g a)
instance (a ~ a0, a0 ~ a1, a1 ~ a2) => T (a0 -> b, a1 -> c, a2 -> d) a
(b, c, d) where
tuple (f, g, h) a = (f a, g a, h a)
Intuitively it seems to be exactly the same as the type families'
aproach, and looks quite clear too.
On 9/15/11, Richard O'Keefe
On 14/09/2011, at 2:45 PM, Casey McCann wrote:
class Tuple t where type Arg t :: * type Result t :: * tuple :: t -> Arg t -> Result t
instance (x1 ~ x2) => Tuple (x1 -> a, x2 -> b) where type Arg (x1 -> a, x2 -> b) = x1 type Result (x1 -> a, x2 -> b) = (a, b) tuple (f, g) x = (f x, g x)
That's it, that's what I was after. Thanks.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- Markus Läll