The module `System.IO.ExplicitIOModes` exports a `Handle` to a file which is parameterized with the IOMode the handle is in. All operations on handles explicitly specify the needed IOMode. This way it is impossible to read from a write-only handle or write to a read-only handle for example. See the [explicit-iomodes-bytestring] and [explicit-iomodes-text] packages for `ByteString` / `Text` operations. [explicit-iomodes-bytestring]: http://hackage.haskell.org/package/explicit-iomodes-bytestring [explicit-iomodes-text]: http://hackage.haskell.org/package/explicit-iomodes-text