[Haskell-beginners] How can I lift my function taking a function to a Monad?

Kim-Ee Yeoh ky3 at atamo.com
Thu Dec 10 17:43:02 UTC 2015


On Thu, Dec 10, 2015 at 10:16 PM, Simon Peter Nicholls <simon at mintsource.org
> wrote:


> Does `m a :-> m b` make sense for the latest releases of fclabels? Is it
> just the lifting that's a problem?


Yes, you can still write a function of type Monad m => (a :-> b) -> (m a
:-> m b). But it's gotten a bit trickier as you can tell.

The wrong way is to try to write:

neededLift :: (Monad m) => ((b -> b) -> a -> a) -> (m b -> m b) -> m a -> m
a

which, 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 b
liftALabel l0 = lens g1 m1  where
   g1 = fmap (get l0)
   s1 = liftA2 (set l0)
   m1 = isoL g1 s1

Naturally, monad has been effect-reduced to applicative to admit more legal
programs.

-- Kim-Ee
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20151211/581a7796/attachment.html>


More information about the Beginners mailing list