For cycling through workspaces (in my setup with Win-PgUp/PgDown, you can achieve what you want using moveTo Prev HiddenWS and moveTo Next HiddenWS (defined in X.A.CycleWS). For switching to workspaces, say 1..10, directly without messing with their assignment to monitors, XMonad has XMonad.StackSet.view. With the behaviour you describe, I suspect that your workspace switching keys are bound to XMonad.StackSet.greedyView. XMonad.StackSet.view simply focuses the requested workspace if it is already visible on some monitor and otherwise behaves the same as greedyView.
Cheers,
Norbert