
On Mon, 7 Oct 2013, Edward Kmett wrote:
A rule of thumb that has served me well w.r.t exposing internal modules is to expose a Data.Foo.Internal but make it clear it is a very fragile interface. Even by going to far as to say this module does not follow the PVP and that they should expect breaking changes to come fast and often. Users should only safely depend on it with minor-version specific bounds then. This ameliorates the concerns about how it ties your hands as an implementor.
A PVP compliant solution would be to divide 'containers' into 'containers-internal' and 'containers'. The new package 'containers-internal' exposes internal data structures, but increases version numbers at a higher rate than 'containers'. The package 'containers' would only expose the public API and thus a more stable interface.