Thanks, it is still a bit fuzzy to me ...

I understand what you did  but what confuses me is that when i look at function with signature like 

f :: Monad m => c -> m d

I always think that return type is somehow restricted in comparison to input because it demands that output type is wraped inside something (monad in this case).

For such signature to fit id signature (a -> a) ,  c type shoud be also wraped inside monad but it is not case here... 

Anyhow, I still have to figure it out

thanks