On Thu, 10 Dec, 2015 at 6:43 PM, Kim-Ee Yeoh <ky3@atamo.com> wrote:
The wrong way is to try to write:neededLift :: (Monad m) => ((b -> b) -> a -> a) -> (m b -> m b) -> m a -> m awhich, as Daniel pointed out, is impossible.So we start with the isomorphisms:
isoL :: (f -> a) -> (a -> f -> f) -> ((a -> a) -> (f -> f))
isoL g s m f = s (m (g f)) f
isoR :: (f -> a) -> ((a -> a) -> (f -> f)) -> (a -> f -> f)
isoR _ m a = m (const a)It turns out we really only need isoL, but isoR is there for completeness.Then we write:liftALabel :: Applicative f => a :-> b -> f a :-> f bliftALabel l0 = lens g1 m1 where
g1 = fmap (get l0)
s1 = liftA2 (set l0)
m1 = isoL g1 s1Naturally, monad has been effect-reduced to applicative to admit more legal programs.-- Kim-Ee