[Haskell-beginners] How can I lift my function taking a function to a Monad?
Simon Peter Nicholls
simon at mintsource.org
Thu Dec 10 15:16:40 UTC 2015
Hiya,
That would certainly explain why I found it difficult.
Here's the original definition:
liftMLabel :: Monad m => a :-> b -> m a :-> m b
liftMLabel l = label (liftM $ get l) (liftM2 $ set l)
Are here's a sample iteration of me hacking around:
liftMLens :: Monad m => a :-> b -> m a :-> m b
liftMLens l = lens getter modifier
where
getter = liftM $ get l
modifier mf mm = mf >>= \ f -> modify l f `liftM` mm
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!
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.
Does `m a :-> m b` make sense for the latest releases of fclabels? Is
it just the lifting that's a problem?
Si
On Thu, 10 Dec, 2015 at 3:02 PM, Daniel Bergey <bergey at teallabs.org>
wrote:
> On 2015-12-10 at 07:43, Simon Peter Nicholls <simon at mintsource.org>
> wrote:
>> So I figure I need:
>>
>> neededLift :: (Monad m) => ((b -> b) -> a -> a) -> (m b -> m b) ->
>> m a
>> -> m a
>
> 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).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20151210/000d93c3/attachment.html>
More information about the Beginners
mailing list