В главе 15 Реального мира Haskell определяется класс типа:
class (Monad m) => MonadSupply s m | m -> s where
Пара абзацев позже, это говорит, что>> = и возврат не должны быть определены из-за контекста. Но нет никакого дальнейшего объяснения того, что это подразумевает под контекстом.
Как компилятор знает, что MonadSupply является экземпляром Монады, если только 'm' является экземпляром Монады?
Контекст" - это просто часть между class
и =>
, которая в данном случае является ограничением Monad m
. И оно не столько "знает", сколько принуждает к этому - написание экземпляра MonadSupply
для типа m
, у которого также нет экземпляра Monad
, приведет к ошибке компилятора.