It seems like fromList is as pretty as it gets. Actually it is not
that bad.
Agreed. What you might want to look into is the difference between /expressions/ and imperative statements, also known as /commands/.
The effectful nature of commands is typically modeled in Haskell using monads, which may explain your references to do-notation and chaining functions.
The mapping operations you're asking about can be easily /described/ using expressions, so monads don't need to enter the picture. Minimize effects whenever possible.