
I am not clear why you think the current notation is confusing... Could you give a concrete example? I am thinking of something along the lines: based on how "<-" works in list comprehensions and the do notation, I would expect that pattern guards do XXX but instead, they confusingly do YYY. I think that this will help us keep the discussion concrete.
consider the following examples: -- do-notation: explicit return; explicit guard; monadic result d _ = do { Just b <- return (Just True); guard b; return 42 } -- list comprehension: explicit return; implicit guard; monadic (list) result lc _ = [ 42 | Just b <- return (Just True), b ] -- pattern guard: implicit return; implicit guard; non-monadic result pg _ | Just b <- Just True, b = 42 in spite of their similarity, all of these constructs handle some of the monadic aspects differently. the translations of pattern guards not only embed statements in "guard", they also embed the right hand sides of generators in "return". translations of list comprehensions only lift statements. translation of do-notation lifts neither statements nor generators. does this clarify things? Claus