HaskellらしくStateMonad使って持ちまわればいいんじゃね