
On Tue, May 05, 2009 at 10:28:10AM -0300, Marco Túlio Gontijo e Silva wrote:
Em Seg, 2009-05-04 às 15:54 -0400, Brent Yorgey escreveu:
On Mon, May 04, 2009 at 11:59:54AM -0300, Marco Túlio Gontijo e Silva wrote:
instance (F f, M m (f a)) => M m a where mm f v = mm (m f) v
Perhaps you mean
instance (F f, M m a) => M m (f a) where ...
?
No, I really meant what I wrote. An example: If I the instances I wrote:
instance F [] where m = map
instance M (IORef a) a where mm = flip modifyIORef
I want to define:
instance M (IORef [a]) a where mm f v = mm (m f) v
This could of course be written as:
mm = mm . m
I'd like to get this last instance automaticly from that definition, having:
f = [] m = IORef [a]
I don't follow. In order to get instance M (IORef [a]) a from instance (F f, M m (f a)) => M m a would require instance M (IORef [a]) (f a) for some f, which you don't have. I might try rewriting M as class M f a where mm :: (a -> a) -> f a -> IO () and then your automatic lifting instance would be something like instance (F f, M f2 a) => M (f :.: f2) a where :.: denotes functor composition. -Brent