>>880
たぶん、理解しているんだろうけど、main の 最後の print がオレを不安にさせる。
"OldHP: ..." を表示させたいだけなら、それはいらないよ。

それと、addHP の 最後の return () もいらない。
そのほか、オレなら、こういう感じに書くかな。

addHP n = do
Player m <- get
liftIO $ putStrLn $ "OldHP: " ++ show m
put $ Player $ n + m


>>881
MTL のバージョン、古くない?
オレの環境(2.0.1.0)だと、Stateデータコンストラクタはエクスポートされていないみたいなんだけど。

で、pgen の >>= は >> に変えられる。
+> は オレならこう書く:

(+>) :: State Player (IO ()) -> Int -> State Player (IO ())
st +> n = state k
where
act = putStrLn $ "hp +" ++ show n
k s = let (act', Player i) = runState st s
in (act' >> act, Player $ i + n)