Category "do-notation"

how exactly do expression makes the list comprehension redundant haskell

We know that list comprehensions and do expressions are equivalent for lists. Also list comprehensions are redundant. But can someone explain how exactly do not

How does Haskell "desugar" getline in this do block?

I've read a few books on Haskell but haven't coded in it all that much, and I'm a little confused as to what Haskell is doing in a certain case. Let's say I'm u