Haskell初心者ですが、RealWorldHaskell読んでいて、状態モナドもどきを自作してみようと思って

newtype State s a = StateMonad { stateFunc :: s -> (a,s) }

とやってみて

somefunc :: (a -> b) -> State s a -> State s b
somefunc f (StateMonad g) = StateMonad( \s-> (f(fst(g s)), snd(g s)))

は通るのに

instance Functor (State s) where
fmap :: (a -> b) -> State s a -> State s b
fmap f (StateMonad g) = StateMonad( \s-> (f(fst(g s)), snd(g s)))

が通らないのがわからなくて困っています。

★質問: fmap をどのように宣言するのが正解なのでしょうか?
(fmap :: (a -> b) -> State s a -> State s b の一行を消しても型推論で通りますが、それは気持ち悪いのです)。