Зачем нужны монады?
Я как-то был на лекции по функц. программированию и лектор сказал, что если вы спрашиваете зачем вам использовать монады, тогда вам не нужно использовать монады, так что послушай умного человека (лектора) и расслабься :)
То, что вы описали - частный случай.
Вот несколько частных случаев (хаскель vs псевдокод).
Обратите внимание, что на Хаскеле код линейный
То, что сделано монадами, в других языках нередко встроено. Удобство невстроенного решения в том, что есть немало функций, которые работают с любыми монадами (mapM, filterM, ...), применить которые к встроенным в язык вещам может быть проблематично.
1. nullabledo
    x <- foo
    y <- bar x
    return $ baz y
вместоx = foo();
if (x) {
    y = bar();
    if (y) {
        return baz(y); } }
2. спискиdo
    x <- lines str
    y <- words x
    return $ length y
вместоfor (x in lines(str))
    for (y in words(x))
        yield y.length();
3. continuationdo
    h1 <- ContT $ withFile "1.txt" ReadMode
    h2 <- ContT $ withFile "2.txt" WriteMode
    liftIO $ ...use handles...
вместоusing (h1 = File.Open("1.txt", File.Mode.Read)) {
    using (h2 = File.Open("2.txt", File.Mode.Write)) {
        ...use files... }}
Причем можно, например, и так:do
    -- сразу список файлов открываем
    hs <- mapM (\name -> ContT (withFile name ReadMode))
        ["1.txt", "2.txt", "3.txt", "4.txt"]
А как сделать так с using'ами?