On Tue, Nov 18, 2003 at 05:56:19PM -0800, [EMAIL PROTECTED] wrote:
>
> Abraham Egnor wrote:
>
> > The classic way to write a lift function for tuples is, of course:
>
> > liftTup f (a, b) = (f a, f b)
>
> > which has a type of (a -> b) -> (a, a) -> (b, b). I've been wondering if
> > it would be possible to write a function that doesn't require the types in
> > the tuple to be the same, just that the types in the second tuple are the
> > result of applying the type transformation implied in the function to be
> > lifted to the types in the first tuple.
>
> Well, it is possible in Haskell. It works even in Hugs!
>
> {-# OPTIONS -fglasgow-exts -fallow-undecidable-instances #-}
>
>
> class Funnable a b | a->b where
> f:: a -> b
>
> instance Funnable Bool Int where
> f = fromEnum
> instance Funnable Char Float where
> f = fromRational . toRational . fromEnum
>
> class LP a b c d where
> liftf:: (a, b) -> (c, d)
>
> instance (Funnable a c, Funnable b d) => LP a b c d where
> liftf (a,b) = (f a, f b)
>
> Main> liftf (True,'z')
> (1,122.0)This seems different from what Abraham Egnor asked for, because it allows one to provide many different implementations for f. It corresponds more closely to > liftTup' (f1, f2) (a, b) = (f1 a, f2 b) which is of course typable with in Haskell. Main> liftTup' (fromEnum, fromRational . toRational . fromEnum) (1, 122.0) (1,122.0) -- Sebastien
signature.asc
Description: Digital signature
_______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell
