"Since haskell is a purely functional language the general idea here is that we work on modified copies of data, rather than updating the data in-place."
Note that in terms of the actual machine code being run, most "copies" will be doing in-place memory modification. It's similar to how a for loop/function call in C may not need to be a for loop/function call, the compiler is free to do various optimizations under the hood.