What makes MLton decide to do the flattening or not. In the case with the { key: Word.word, ord: int } elements, I never handle any of the elements except in the array so if it didn't flatten them, I can't imagine when it would. Certainly there was no sharing.