>> = реализация (State s) Monad в Haskell - PullRequest
1 голос
/ 02 марта 2020

В книге «Учим тебя, 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, но мы должны рассматривать его как тип ввода монады.

1 Ответ

3 голосов
/ 02 марта 2020

Поскольку f имеет тип a -> m b (фактически a -> State s b), его вход имеет тип a. Это вывод , тип которого имеет форму s -> (b, s) (на самом деле, State s b), которую вы упоминаете.

...