
* That explicit exports are never necessary. Moreover, that explicit exports are harmful as they make checking of non-exported definitions impossible.
It's not just the internal API in the form of constructors that's worth hiding. What about helper functions? The ones that would be "private" in an OOP language? Should I rip my logical structure apart just because exports are tedious? In fact the OOP separation is a decent framework to reference for perspective: public → (explicitly) exported private → not exported at all package protected → exported from internal module protected → not directly controlled by exports, but by types and available construction paths All have an equivalent, all are necessary. But I agree that explicit exports are flawed, because the vast majority of "stuff" is usually exported. A better way might be to export everything except explicitly hidden stuff. That's not possible right now (I think), but imagine syntax like this: module Foo (..) hiding ( bar, baz ) where or module Foo (module Foo hiding ( bar, baz )) where