<div>Hiya,</div><div><br></div>That would certainly explain why I found it difficult.<div><br></div><div>Here's the original definition:</div><div><br></div><div><div>liftMLabel :: Monad m => a :-> b -> m a :-> m b</div><div>liftMLabel l = label (liftM $ get l) (liftM2 $ set l)</div><div><br></div><div>Are here's a sample iteration of me hacking around:</div><div><br></div><div>liftMLens :: Monad m => a :-> b -> m a :-> m b</div><div>liftMLens l = lens getter modifier</div><div>  where</div><div>    getter = liftM $ get l</div><div>    modifier mf mm = mf >>= \ f -> modify l f `liftM` mm</div><div><br></div>I only ever seem to replicate liftM2 characteristics when trying to brute force an implementation. And the implementations get more and more brutish as time goes on!</div><div><br></div><div>It makes me wonder if the implications of fclabels `m a :-> m b` are radically different now, bearing in mind the original code worked. The fclabels :-> type operator has convinced the compiler that `m b -> mb` is required for the actual value modifying function.</div><div><br></div><div>Does `m a :-> m b` make sense for the latest releases of fclabels? Is it just the lifting that's a problem?</div><div><br></div><div>Si</div><div><br>On Thu, 10 Dec, 2015 at 3:02 PM, Daniel Bergey <bergey@teallabs.org> wrote:<br>
<blockquote type="cite"><div class="plaintext" style="white-space: pre-wrap;">On 2015-12-10 at 07:43, Simon Peter Nicholls <<a href="mailto:simon@mintsource.org">simon@mintsource.org</a>> wrote:
<blockquote> So I figure I need:

 neededLift :: (Monad m) => ((b -> b) -> a -> a) -> (m b -> m b) -> m a 
 -> m a
</blockquote>
I don't believe `neededLift` is possible.  The type says that given any
function `m b -> m b`, you can turn that function into one of type `b ->
b` (as input to the lens).
</div></blockquote></div>