I have written a first attempt at a fold function for the heterogenious list: 

class RFold i r where
   rFold :: (forall a . a -> i -> i) -> i -> r -> i
instance RFold i RNil where
   rFold f i RNil = i 
instance RFold i r => RFold i (a `RCons` r) where
   rFold f i (x `RCons` xs) = f x (rFold f i xs)

This works providing the folded 'op' has the type: forall a . a -> i -> i
which means it does not work for functions like show :: forall a . Show a => a -> i -> 
i
as the types are different. I have not figured out a way to make it accept a 
constraint 
like Show for example. Here is an example:

length = rFold (\_ -> (+1)) 0 relation

The use of such a function seems limited, if constraints like Show cannot be used, as
most useful applications of fold would require some kind of class membership for 
example:

string = rFold shows "" relation 

This fails to compile because shows has type:

shows :: forall a . Show a => a -> i -> i

but fold expects

op :: forall a . a -> i -> i

        Regards,
        Keean Schupke.
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to