Would it not be sufficient to define Edit a minimally as:
data Edit a = Insert Int a
| Delete Int
given that a Delete only needs the place of deletion and a Replace is a Delete followed by an Insert?