It's perfectly fine to write code not using functional dependencies, it's just a pain to use since the inference sucks.
Basically without FDs, the function get :: MonadState m s => m s
will have to figure out m
and s
independently. Usually m
is quite easily inferred, but often s
would require an explicit annotation.
Moreover, this is much more general than we need, so instead we can restrict our typechecker to say "For m
, there is exactly 1 s
", this way, once m
is inferred, s
is obvious to the type inference algorithm