Hello, I have such a question: assume you have some type `T` which has Applicative and Monad instances. Is it ok if code like this: 

foo :: Int -> T String
bar :: Int -> T Int

(,) <$> foo 10 <*> bar "20" 

behaves not like this code: 

foobar = do
    x <- foo 10
    y <- bar "20"
    return (x, y)

The word "behaves" I mean not just returning value but the effect performed also.