Arrays are not based on lists, they are implemented similarly to other programming languages, with a continuous memory area.
The most common way to create them, the array function takes a list of index, value pairs as an argument and when you print them they are shown like such a list as well. This is because arrays in Haskell can be indexed not just by integers but by anything that implements the Ix typeclass, for example (Int, Int)-pairs, Booleans, Char's and many other versions. So the [(index, value)] representation is really the only sensible, consistent way to display an array as general as the ones in Haskell.
Data.ArrayandData.Listrequire "copy everything" to add to the end of an (array/list).Data.Array.MArrayhas fixed bounds. If you wish to change the number of elements, you must create a new array.