В книге «Учим тебя, A Haskell для великого блага», реализация оператора >> = в (State s) Monad:
instance Monad (State s) where
return x = State $ \s -> (x, s)
(State h) >>= f = State $ \s -> let (a, newState) = h s
(State g) = f a
in g newState
Как мы знаем, >> = Оператор имеет тип >>=::m a -> (a -> m b) -> m b
. Вторым параметром этого оператора является функция f , тип которой (a -> m b)
, так почему тип ввода функции f в реализации (State s) не равен s -> (a, s)
но только результат a
?
Спасибо всем! Я думаю, что я понял, как >> = работает. Мы не можем рассматривать тип ввода функции f как тип, содержащийся в Monad, но мы должны рассматривать его как тип ввода монады.