
Hello, Dear List! Consider, I have: request1 :: A -> Connection -> IO () request2 :: A -> Connection -> IO A How does it work - resp <- getConnection >>= do request1 myA request2 anotherA ?! It is compiled but seems that does not execute `request1`... `request1 myA` gets `Connection` value, good. But it does not return `IO Connection`! It returns `IO ()`. But how does `request2 anotherA` get `Connection` value too? Because this is not compiled sure: resp <- getConnection >>= request1 myA >>= request2 anotherA I tried this: module Main where f1 :: Int -> IO () f1 i = do print "f1!" print i return () f2 :: Int -> IO Int f2 i = do print "f2!" print i return i f0 :: IO Int f0 = pure 10 main :: IO () main = f0 >>= do f1 f2 >> print "end" and I get output: "f2!" 10 "end" which means that `f1` is not executing in `do..`-block, but how does `f2` get 10 as input?! == Cheers, Paul