A Sinful Imperative QuickChecker in Ruby
metacircus.com
metacircus.com
Also, side-effects aren't "bad" and you aren't "sinning". It's just hard to reason about what happens when side-effect-causing units are composed with each other. The Ruby approach is to hope nothing bad happens; the Haskell approach is to let the type system ensure that nothing bad happens. Many people like to make their code robust, so they try to avoid unstructured side-effects.
One more unrelated tidbit, I had trouble understanding "monads" until I realized that "monad" is an adjective, not a noun. You can't go out and buy a "monad", just like you can't go out and buy a "red". "monadic" is a property of a type (like "red" is a property of a strawberry). "monad" is just a convenient way to say "a type that is monadic" with less syllables. Once you are happy with that, Haskell is really easy.