Haskell, 47 57 50 bytes
e#l|a:b<-l,e==a= -2*a:b|1<2=e:l
map abs.foldr(#)[]
Uses reduce (or fold as it is called in Haskell, here a right-fold foldr). Usage example: map abs.foldr(#)[] $ [2,2,2,4,4,8] -> [2,4,8,8].
Edit: +10 bytes to make it work for unsorted arrays, too. Merged numbers are inserted as negative values to prevent a second merge. They are corrected by a final map abs.