I agree with the solution in the second link: if you want a certain condition to hold on the parameter, it needs to be made explicit. As for whether this restriction is necessary, I believe it is because I don't see any way of deciding the question 'a Monad.t = 'a u without examining the abstract type hidden in a particular Logger. What if you made LOGGER a functor parameterized on a Monad?