Я пытаюсь сделать StateMonadPlus
экземпляром MonadState
.
data StateMonadPlus s a = StateMonadPlus (s -> Either String (a, s))
instance MonadState s (StateMonadPlus s) where
-- get :: StateMonadPlus s
get = StateMonadPlus (\s -> Right (s, s))
-- put :: s -> StateMonadPlus ()
put s = StateMonadPlus (\_ -> Right ((), s))
Код компилируется просто отлично, но когда я раскомментирую типы get и put, он жалуется, что
A3.hs:17:5: Misplaced type signature: get :: StateMonadPlus s
A3.hs:19:5: Misplaced type signature: put :: s -> StateMonadPlus ()
Что не так с типами?