I see no reason to have "CompoundBytes" at all, ByteString is already rope-like

So unless there's a compelling reason to make things more abstract, why not just:

Bytes
|--ByteString
|--FileBytes