Your print-n-times doesn't return an action---it's an imperative function that performs an action.
The naive translations to Scheme would be as follows:
(define (skip-many p)
(<|> (>> p (skip-many p))
(return 'nothing)))
(define (print-n-times n s)
(if (= 0 n)
(return 'nothing)
(>> (put-str-ln s)
(print-n-times (- n 1) s))))
In order to fix the infinite recursion in my first example, the parsing framework I made in Scheme had a macro `thunk-parser` (actually, it had a shorter, stupid-sounding name) which for all intents and purposes just wraps the expression in a (lambda ()). (define (skip-many p)
(<|> (>> p (thunk-parser (skip-many p)))
(return 'nothing)))
Also, both your examples rely heavily on non-strict evaluation. 'and' and 'or' are both macros that non-strictly evaluate expressions.