use free monad transformer instead of free monad