lifting functions to tuples?
sebc at macs.hw.ac.uk
sebc at macs.hw.ac.uk
Wed Nov 19 09:17:43 EST 2003
On Tue, Nov 18, 2003 at 05:56:19PM -0800, oleg at pobox.com 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-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://haskell.org/pipermail/haskell/attachments/20031119/6da71e33/attachment.bin
More information about the Haskell
mailing list