hi, first one : i've read in different places that "there is nothing magic with do" and that do { x <- m ; return x } is the *same* as m >>= \x -> return x however i've came up with : m :: Maybe Int m = return 4 check5 = do { 5 <- m ; return 0 } check5' = m >>= \5 -> return 0 the first check5 is ok and return Nothing while the second check5' will raise an "Exception: Non-exhaustive patterns" (which is what i've expected). the sentence "there is nothing magic with do" with its reason are important for me to understand monads and do notation, so maybe someone can rephrase "there is nothing magic with do" and explain the exposed behavior? second one: is it possible to write something like type Point = (Float, Float) type Vector = (Float, Float) and still have type safety (i.e. not be able to mix Point and Vector) (and still have (*,*) without constructor)? thanks, minh thu