# Why aren't modules prefixed their package name?

**URL:** <https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025>\
**Category:** Learn\
**Created:** [May 1, 2026, 4:33pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025 "2026-05-01T16:33:39Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![superstar64](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/superstar64/32/5308_2.png) [@superstar64](https://discourse.haskell.org/u/superstar64)\
**Post date:** [May 1, 2026, 4:33pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/1 "2026-05-01T16:33:40Z")

</div>

This follows from discussion on the Functional Programming Discord.

In Java, Python and various other languages, modules are always prefixed with their package name. For example: `import org.springframework. ...` from Java or `import pandas` from Python.

Why do Haskell packages not do this? Is it a cultural thing?

For some additional context, we where discussing this transitive package dependencies. If package `A`, depends on `B` and `B` depends on `C`, should `A` be allowed to import `C`’s modules without directly depending on `C`. I’m inclined to say yes because `B`’s types may not make sense without `C`’s types.

These transitive dependencies would cause problems if module names where not prefixed with their package name. In Java and Python, because nearly all modules are prefixed. They don’t run into this problem. I am not familiar with their language package managers to say if their dependencies are transitive, but they certainly have the option to make them so. Their language runtimes don’t allow overlapping packages names.

In [Hazy](https://github.com/superstar64/hazy), I plan making packages have transitive dependencies and I currently expect full qualified module names to be unique. I am aware that GHC allows packages to have overlapping module names but I am hesitant to allow this.

---

<div class="post-metadata">

**Author:** ![ashokkimmel](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/ashokkimmel/32/5111_2.png) [@ashokkimmel](https://discourse.haskell.org/u/ashokkimmel)\
**Post date:** [May 1, 2026, 4:51pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/2 "2026-05-01T16:51:41Z")

</div>

> [@superstar64](#):
>
> For some additional context, we where discussing this transitive package dependencies. If package `A`, depends on `B` and `B` depends on `C`, should `A` be allowed to import `C`’s modules without directly depending on `C`. I’m inclined to say yes because `B`’s types may not make sense without `C`’s types.

In that case, I think module `B` should reexport the modules of package `C`, allowing for `A` to not depend on `C`. Also, many packages do use the name of their project/something related as a root. e.g. `Dataframe`,`units`,`dimensional`.

> These transitive dependencies would cause problems if module names where not prefixed with their package name.

What problems?

---

<div class="post-metadata">

**Author:** ![f-a](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/f-a/32/2740_2.png) [@f-a](https://discourse.haskell.org/u/f-a)\
**Post date:** [May 1, 2026, 4:53pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/3 "2026-05-01T16:53:30Z")

</div>

> [@superstar64](#):
>
> If package `A`, depends on `B` and `B` depends on `C`, should `A` be allowed to import `C`’s modules without directly depending on `C`[?] I’m inclined to say yes because `B`’s types may not make sense without `C`’s types.

If that is the case, I expect library `B` to re-export what is needed from `C`, although [it has its drawbacks](https://pvp.haskell.org/faq/#what-implications-does-the-pvp-have-when-re-exporting-api-elements).

---

<div class="post-metadata">

**Author:** ![superstar64](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/superstar64/32/5308_2.png) [@superstar64](https://discourse.haskell.org/u/superstar64)\
**Post date:** [May 1, 2026, 4:58pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/4 "2026-05-01T16:58:45Z")

</div>

> [@ashokkimmel](#):
>
> What problems?

The problem is that there would be incompatible sets of packages. If package `A` and `B` both export module `X`. Then you can’t depend on both `A` and `B` because `import X` would be ambiguous.

With my current plan for Hazy, not only would you not be able to depend on both `A` and `B`, but it would disallow `A` and `B` from appearing in the same program at all. As I expect module names to be unique.

---

<div class="post-metadata">

**Author:** ![simonmic](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/simonmic/32/1796_2.png) [@simonmic](https://discourse.haskell.org/u/simonmic)\
**Post date:** [May 1, 2026, 5:08pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/5 "2026-05-01T17:08:21Z")

</div>

> [@ashokkimmel](#):
>
> What problems?

This kind of breakage, for example:

> <https://github.com/yesodweb/yesod/issues/1917>
>
> \`\`\`
> Building library for yesod-static-1.6.1.2...
> \[1 of 7\] Compiling Yesod.Embedd…edStatic.Types ( Yesod/EmbeddedStatic/Types.hs, dist/build/Yesod/EmbeddedStatic/Types.o, dist/build/Yesod/EmbeddedStatic/Types.dyn\_o )
> \[2 of 7\] Compiling Yesod.EmbeddedStatic.Generators ( Yesod/EmbeddedStatic/Generators.hs, dist/build/Yesod/EmbeddedStatic/Generators.o, dist/build/Yesod/EmbeddedStatic/Generators.dyn\_o )
> \[3 of 7\] Compiling Yesod.Static ( Yesod/Static.hs, dist/build/Yesod/Static.o, dist/build/Yesod/Static.dyn\_o )
> Yesod/Static.hs:414:22: error: \[GHC-39999\]
> • Could not deduce ‘ByteArray.ByteArrayAccess (Digest MD5)’
> arising from a use of ‘ByteArray.convert’
> from the context: ByteArray.ByteArray bout
> bound by the inferred type of
> encode :: ByteArray.ByteArray bout =\> Digest MD5 -\> bout
> at Yesod/Static.hs:414:11-56
> • In the expression: ByteArray.convert (d :: Digest MD5)
> In an equation for ‘encode’:
> encode d = ByteArray.convert (d :: Digest MD5)
> In an equation for ‘base64md5File’:
> base64md5File
> = fmap (base64 . encode) . hashFile
> where
> encode d = ByteArray.convert (d :: Digest MD5)
> |
> 414 | where encode d = ByteArray.convert (d :: Digest MD5)
> | ^^^^^^^^^^^^^^^^^
> 
> Yesod/Static.hs:422:16: error: \[GHC-39999\]
> • Could not deduce ‘ByteArray.ByteArrayAccess (Digest MD5)’
> arising from a use of ‘ByteArray.convert’
> from the context: ByteArray.ByteArray bout
> bound by the inferred type of
> encode :: ByteArray.ByteArray bout =\> Digest MD5 -\> bout
> at Yesod/Static.hs:422:5-50
> • In the expression: ByteArray.convert (d :: Digest MD5)
> In an equation for ‘encode’:
> encode d = ByteArray.convert (d :: Digest MD5)
> In an equation for ‘base64md5’:
> base64md5 lbs
> = base64
> $ encode $ runConduitPure $ Conduit.sourceLazy lbs .| sinkHash
> where
> encode d = ByteArray.convert (d :: Digest MD5)
> |
> 422 | encode d = ByteArray.convert (d :: Digest MD5)
> Error: \[Cabal-7125\]
> \`\`\`
> 
> 
> Dependencies:
> 
> \`\`\`
> \- Decimal-0.5.2 (lib) (requires download & build)
> - Diff-1.0.2 (lib) (requires download & build)
> - OneTuple-0.4.2.1 (lib) (requires download & build)
> - Only-0.1 (lib) (requires download & build)
> - SHA-1.6.4.4 (lib) (requires download & build)
> - StateVar-1.2.2 (lib) (requires download & build)
> - appar-0.1.8 (lib:appar) (requires download & build)
> - assoc-1.1.1 (lib) (requires download & build)
> - attoparsec-0.14.4 (lib:attoparsec-internal) (requires download & build)
> - base-compat-0.15.0 (lib) (requires download & build)
> - base-orphans-0.9.4 (lib) (requires download & build)
> - base16-bytestring-1.0.2.0 (lib) (requires download & build)
> - base64-bytestring-1.2.1.0 (lib) (requires download & build)
> - basement-0.0.16 (lib) (requires download & build)
> - blaze-builder-0.4.4.1 (lib) (requires download & build)
> - byteorder-1.0.4 (lib:byteorder) (requires download & build)
> - call-stack-0.4.0 (lib) (requires download & build)
> - cereal-0.5.8.3 (lib) (requires download & build)
> - character-ps-0.1 (lib) (requires download & build)
> - clock-0.8.4 (lib) (requires download & build)
> - cmdargs-0.10.22 (lib) (requires download & build)
> - colour-2.3.7 (lib) (requires download & build)
> - control-monad-free-0.6.2 (lib) (requires download & build)
> - cryptohash-md5-0.11.101.0 (lib) (requires download & build)
> - csv-0.1.2 (lib:csv) (requires download & build)
> - data-default-0.8.0.2 (lib) (requires download & build)
> - dlist-1.0 (lib) (requires download & build)
> - emojis-0.1.4.1 (lib) (requires download & build)
> - entropy-0.4.1.11 (lib:entropy) (requires download & build)
> - extensible-exceptions-0.1.1.4 (lib:extensible-exceptions) (requires download & build)
> - file-embed-0.0.16.0 (lib) (requires download & build)
> - half-0.3.3 (lib) (requires download & build)
> - hashable-1.5.1.0 (lib) (requires download & build)
> - haskeline-0.8.4.1 (lib) (requires download & build)
> - hourglass-0.2.12 (lib) (requires download & build)
> - hsc2hs-0.68.10 (exe:hsc2hs) (requires download & build)
> - html-1.0.1.2 (lib:html) (requires download & build)
> - indexed-traversable-0.1.4 (lib) (requires download & build)
> - integer-logarithms-1.0.5 (lib) (requires download & build)
> - microlens-0.5.0.0 (lib) (requires download & build)
> - mime-types-0.1.2.2 (lib) (requires download & build)
> - mtl-compat-0.2.2 (lib) (requires download & build)
> - network-byte-order-0.1.8 (lib) (requires download & build)
> - old-locale-1.0.0.7 (lib) (requires download & build)
> - parser-combinators-1.3.1 (lib) (requires download & build)
> - prettyprinter-1.7.1 (lib) (requires download & build)
> - primitive-0.9.1.0 (lib) (requires download & build)
> - quote-quot-0.2.1.0 (lib) (requires download & build)
> - ram-0.22.0 (lib) (requires download & build)
> - reflection-2.1.9 (lib) (requires download & build)
> - regex-base-0.94.0.3 (lib) (requires download & build)
> - safe-0.3.21 (lib) (requires download & build)
> - split-0.2.5 (lib) (requires download & build)
> - splitmix-0.1.3.2 (lib) (requires download & build)
> - tagged-0.8.10 (lib) (requires download & build)
> - th-abstraction-0.7.2.0 (lib) (requires download & build)
> - th-compat-0.1.7 (lib) (requires download & build)
> - time-hourglass-0.3.0 (lib) (requires download & build)
> - timeit-2.0 (lib) (requires download & build)
> - transformers-compat-0.7.2 (lib) (requires download & build)
> - uglymemo-0.1.0.1 (lib:uglymemo) (requires download & build)
> - unliftio-core-0.2.1.0 (lib) (requires download & build)
> - utf8-string-1.0.2 (lib) (requires download & build)
> - utility-ht-0.0.17.2 (lib) (requires download & build)
> - vector-stream-0.1.0.1 (lib) (requires download & build)
> - contravariant-1.5.6 (lib) (requires download & build)
> - memory-0.18.0 (lib) (requires download & build)
> - blaze-markup-0.8.3.0 (lib) (requires download & build)
> - extra-1.8.1 (lib) (requires download & build)
> - ansi-terminal-types-1.1.3 (lib) (requires download & build)
> - data-default-class-0.2.0.0 (lib) (requires download & build)
> - unordered-containers-0.2.21 (lib) (requires download & build)
> - time-compat-1.9.9 (lib) (requires download & build)
> - these-1.2.1 (lib) (requires download & build)
> - text-short-0.1.6.1 (lib) (requires download & build)
> - data-fix-0.3.4 (lib) (requires download & build)
> - case-insensitive-1.2.1.0 (lib) (requires download & build)
> - wizards-1.0.3 (lib) (requires download & build)
> - zlib-0.7.1.1 (lib) (requires download & build)
> - terminal-size-0.3.4 (lib) (requires download & build)
> - network-3.2.8.0 (lib:network) (requires download & build)
> - tabular-0.2.2.8 (lib) (requires download & build)
> - ech-config-0.0.1 (lib) (requires download & build)
> - old-time-1.1.1.0 (lib:old-time) (requires download & build)
> - scientific-0.3.8.1 (lib) (requires download & build)
> - integer-conversion-0.1.1 (lib) (requires download & build)
> - cborg-0.2.10.0 (lib) (requires download & build)
> - text-builder-linear-0.1.3 (lib) (requires download & build)
> - regex-tdfa-1.3.2.5 (lib) (requires download & build)
> - regex-posix-0.96.0.2 (lib) (requires download & build)
> - doclayout-0.5.0.1 (lib) (requires download & build)
> - random-1.3.1 (lib) (requires download & build)
> - distributive-0.6.3 (lib) (requires download & build)
> - crypto-api-0.13.3 (lib:crypto-api) (requires download & build)
> - th-lift-0.8.7 (lib) (requires download & build)
> - microlens-th-0.4.3.18 (lib) (requires download & build)
> - network-uri-2.6.4.2 (lib) (requires download & build)
> - githash-0.1.7.0 (lib) (requires download & build)
> - transformers-base-0.4.6.1 (lib) (requires download & build)
> - mmorph-1.2.2 (lib) (requires download & build)
> - Glob-0.10.2 (lib) (requires download & build)
> - vector-0.13.2.0 (lib) (requires download & build)
> - asn1-types-0.3.4 (lib:asn1-types) (requires download & build)
> - blaze-html-0.9.2.0 (lib) (requires download & build)
> - ansi-terminal-1.1.5 (lib) (requires download & build)
> - cookie-0.5.1 (lib) (requires download & build)
> - async-2.2.6 (lib) (requires download & build)
> - strict-0.5.1 (lib) (requires download & build)
> - base64-1.0 (lib) (requires download & build)
> - base16-1.0 (lib) (requires download & build)
> - http-types-0.12.4 (lib) (requires download & build)
> - iproute-1.7.15 (lib) (requires download & build)
> - crypton-socks-0.6.2 (lib) (requires download & build)
> - unix-time-0.4.17 (lib:unix-time) (requires download & build)
> - megaparsec-9.7.0 (lib) (requires download & build)
> - attoparsec-0.14.4 (lib) (requires download & build)
> - text-iso8601-0.1.1.1 (lib) (requires download & build)
> - text-ansi-0.3.0.1 (lib) (requires download & build)
> - regex-compat-0.95.2.2 (lib) (requires download & build)
> - uuid-types-1.0.6.1 (lib) (requires download & build)
> - temporary-1.3 (lib) (requires download & build)
> - retry-0.9.3.1 (lib) (requires download & build)
> - QuickCheck-2.18.0.0 (lib) (requires download & build)
> - comonad-5.0.10 (lib) (requires download & build)
> - monad-control-1.0.3.1 (lib) (requires download & build)
> - lucid-2.11.20250303 (lib) (requires download & build)
> - math-functions-0.3.4.4 (lib) (requires download & build)
> - indexed-traversable-instances-0.1.2.1 (lib) (requires download & build)
> - hashtables-1.4.2 (lib) (requires download & build)
> - asn1-encoding-0.9.6 (lib) (requires download & build)
> - prettyprinter-ansi-terminal-1.1.3 (lib) (requires download & build)
> - streaming-commons-0.2.3.1 (lib) (requires download & build)
> - serialise-0.2.6.1 (lib) (requires download & build)
> - crypton-pem-0.3.0 (lib) (requires download & build)
> - crypton-asn1-types-0.4.1 (lib) (requires download & build)
> - crypton-1.1.2 (lib) (requires download & build)
> - cassava-0.5.4.1 (lib) (requires download & build)
> - encoding-0.10.2 (lib) (requires download & build)
> - http-api-data-0.7 (lib) (requires download & build)
> - bifunctors-5.6.3 (lib) (requires download & build)
> - witherable-0.5 (lib) (requires download & build)
> - crypto-pubkey-types-0.4.3 (lib:crypto-pubkey-types) (requires download & build)
> - pretty-simple-4.1.4.0 (lib) (requires download & build)
> - optparse-applicative-0.19.0.0 (lib) (requires download & build)
> - http-client-0.7.19 (lib) (requires download & build)
> - crypton-asn1-parse-0.10.0 (lib) (requires download & build)
> - crypton-asn1-encoding-0.10.0 (lib) (requires download & build)
> - mlkem-0.2.0.0 (lib) (requires download & build)
> - hpke-0.1.0 (lib) (requires download & build)
> - cassava-megaparsec-2.1.1 (lib) (requires download & build)
> - semigroupoids-6.0.2 (lib) (requires download & build)
> - profunctors-5.6.3 (lib) (requires download & build)
> - RSA-2.4.1 (lib) (requires download & build)
> - tasty-1.5.4 (lib) (requires download & build)
> - crypton-x509-1.9.0 (lib) (requires download & build)
> - semialign-1.3.1.1 (lib) (requires download & build)
> - modern-uri-0.3.6.1 (lib) (requires download & build)
> - authenticate-oauth-1.7 (lib) (requires download & build)
> - tasty-hunit-0.10.2 (lib) (requires download & build)
> - crypton-x509-store-1.9.0 (lib) (requires download & build)
> - aeson-2.2.4.1 (lib) (requires download & build)
> - crypton-x509-validation-1.9.0 (lib) (requires download & build)
> - crypton-x509-system-1.9.0 (lib) (requires download & build)
> - shakespeare-2.2.0 (lib) (requires download & build)
> - aeson-pretty-0.8.10 (lib) (requires download & build)
> - tls-2.4.1 (lib) (requires download & build)
> - hledger-lib-1.99 (lib) (first run)
> - crypton-connection-0.4.6 (lib) (requires download & build)
> - http-client-tls-0.4.0 (lib) (requires download & build)
> - req-3.13.4 (lib) (requires download & build)
> - hledger-1.99 (lib) (first run)
> - hledger-1.99 (exe:hledger) (first run)
> 
> \- HUnit-1.6.2.0 (lib) (requires download & build)
> - alex-3.5.4.2 (exe:alex) (requires download & build)
> - attoparsec-aeson-2.2.2.0 (lib) (requires download & build)
> - auto-update-0.2.6 (lib) (requires download & build)
> - base-unicode-symbols-0.2.4.2 (lib:base-unicode-symbols) (requires download & build)
> - bitvec-1.1.6.0 (lib) (requires download & build)
> - bsb-http-chunked-0.0.0.4 (lib) (requires download & build)
> - byteable-0.1.1 (lib) (requires download & build)
> - cabal-doctest-1.0.12 (lib) (requires download & build)
> - css-text-0.1.3.0 (lib) (requires download & build)
> - easy-file-0.2.5 (lib) (requires download & build)
> - email-validate-2.3.2.21 (lib) (requires download & build)
> - happy-lib-2.2 (lib:grammar) (requires download & build)
> - haskell-lexer-1.2.1 (lib) (requires download & build)
> - hspec-discover-2.11.17 (lib) (requires download & build)
> - http-date-0.0.11 (lib) (requires download & build)
> - libyaml-clib-0.2.5 (lib) (requires download & build)
> - lift-type-0.1.2.0 (lib) (requires download & build)
> - lifted-base-0.2.3.12 (lib) (requires download & build)
> - monad-loops-0.4.3 (lib) (requires download & build)
> - path-pieces-0.2.1 (lib) (requires download & build)
> - persistent-template-2.12.0.0 (lib) (requires download & build)
> - psqueues-0.2.8.3 (lib) (requires download & build)
> - recv-0.1.1 (lib) (requires download & build)
> - replace-megaparsec-1.5.0.1 (lib) (requires download & build)
> - resource-pool-0.5.0.0 (lib) (requires download & build)
> - resourcet-1.3.0 (lib) (requires download & build)
> - setenv-0.1.1.3 (lib) (requires download & build)
> - silently-1.2.5.4 (lib) (requires download & build)
> - simple-sendfile-0.2.32 (lib) (requires download & build)
> - skein-1.0.9.4 (lib) (requires download & build)
> - stm-chans-3.0.0.11 (lib) (requires download & build)
> - tagsoup-0.14.8 (lib) (requires download & build)
> - th-lift-instances-0.1.20 (lib) (requires download & build)
> - time-manager-0.3.2 (lib) (requires download & build)
> - typed-process-0.2.13.0 (lib) (requires download & build)
> - unliftio-0.2.25.1 (lib) (requires download & build)
> - vault-0.3.1.6 (lib) (requires download & build)
> - word8-0.1.3 (lib) (requires download & build)
> - xml-types-0.3.8 (lib) (requires download & build)
> - quickcheck-io-0.2.0 (lib) (requires download & build)
> - hspec-expectations-0.8.4 (lib) (requires download & build)
> - vector-algorithms-0.9.1.0 (lib) (requires download & build)
> - fast-logger-3.2.6 (lib) (requires download & build)
> - happy-lib-2.2 (lib:tabular) (requires download & build)
> - happy-lib-2.2 (lib:frontend) (requires download & build)
> - network-control-0.1.7 (lib) (requires download & build)
> - clientsession-0.9.3.0 (lib) (requires download & build)
> - xss-sanitize-0.3.7.2 (lib) (requires download & build)
> - http-semantics-0.4.0 (lib) (requires download & build)
> - wai-3.2.4 (lib) (requires download & build)
> - hspec-core-2.11.17 (lib) (requires download & build)
> - mono-traversable-1.0.21.0 (lib) (requires download & build)
> - happy-lib-2.2 (lib:backend-lalr) (requires download & build)
> - happy-lib-2.2 (lib:backend-glr) (requires download & build)
> - http2-5.4.0 (lib) (requires download & build)
> - wai-logger-2.5.0 (lib) (requires download & build)
> - wai-cors-0.2.7 (lib) (requires download & build)
> - hspec-2.11.17 (lib) (requires download & build)
> - conduit-1.3.6.1 (lib) (requires download & build)
> - happy-lib-2.2 (lib) (requires download & build)
> - warp-3.4.13 (lib) (requires download & build)
> - libyaml-0.1.4 (lib) (requires download & build)
> - conduit-extra-1.3.8 (lib) (requires download & build)
> - happy-2.2 (exe:happy) (requires download & build)
> - wai-handler-launch-3.0.3.1 (lib:wai-handler-launch) (requires download & build)
> - wai-extra-3.1.18 (lib) (requires download & build)
> - yaml-0.11.11.2 (lib) (requires download & build)
> - xml-conduit-1.10.1.0 (lib:xml-conduit) (requires download & build)
> - monad-logger-0.3.42 (lib) (requires download & build)
> - http-conduit-2.3.9.1 (lib) (requires download & build)
> - crypton-conduit-0.3.0 (lib) (requires download & build)
> - pretty-show-1.10 (lib) (requires download & build)
> - language-javascript-0.7.1.0 (lib) (requires download & build)
> - wai-app-static-3.2.1 (lib) (requires download & build)
> - html-conduit-1.3.2.2 (lib) (requires download & build)
> - yesod-core-1.6.29.1 (lib) (requires download & build)
> - persistent-2.18.1.0 (lib) (requires download & build)
> - hjsmin-0.2.1 (lib) (requires download & build)
> - yesod-test-1.7.0.1 (lib) (requires download & build)
> - yesod-persistent-1.6.0.8 (lib) (requires download & build)
> - yesod-static-1.6.1.2 (lib) (requires download & build)
> - yesod-form-1.7.9.2 (lib) (requires download & build)
> - yesod-1.6.2.1 (lib) (requires download & build)
> - hledger-web-1.99 (lib) (first run)
> - hledger-web-1.99 (exe:hledger-web) (first run)
> \`\`\`
> 
> Both \`memory\` and its replacement \`ram\` are in this set, and both provide ByteArrayAccess. Perhaps yesod-static needs to specify \`ram\` (or \`memory\`) explicitly when importing, with PackageImports ?

---

<div class="post-metadata">

**Author:** ![ashokkimmel](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/ashokkimmel/32/5111_2.png) [@ashokkimmel](https://discourse.haskell.org/u/ashokkimmel)\
**Post date:** [May 1, 2026, 5:11pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/6 "2026-05-01T17:11:20Z")

</div>

Ok, but if they were already prefixed by package name, the `ram` wouldn’t be a drop in replacement for `memory`. `ram` is intended for someone to just replace `memory` with `ram` in their cabal file. I don’t think there’s any good way to get around this problem.

---

<div class="post-metadata">

**Author:** ![simonmic](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/simonmic/32/1796_2.png) [@simonmic](https://discourse.haskell.org/u/simonmic)\
**Post date:** [May 1, 2026, 5:13pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/7 "2026-05-01T17:13:07Z")

</div>

ram was not a drop-in replacement for memory, it turns out. Better if this were discovered earlier, I think.

---

<div class="post-metadata">

**Author:** ![gregbm](https://avatars.discourse-cdn.com/v4/letter/g/4da419/32.png) [@gregbm](https://discourse.haskell.org/u/gregbm)\
**Post date:** [May 1, 2026, 6:25pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/8 "2026-05-01T18:25:40Z")

</div>

Haskell currently allows you to use package-qualified imports by using the PackageImports extension. The documentation for this extension notes that “You probably don’t need to use this feature” and that “It can lead to fragile dependencies in the common case: modules occasionally move from one package to another, rendering any package-qualified imports broken”

> **[6.3.2. Package-qualified imports — Glasgow Haskell Compiler 9.15.20260306...](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/package_qualified_imports.html)**

---

<div class="post-metadata">

**Author:** ![jackdk](https://avatars.discourse-cdn.com/v4/letter/j/9f8e36/32.png) [@jackdk](https://discourse.haskell.org/u/jackdk)\
**Post date:** [May 1, 2026, 9:38pm UTC](https://discourse.haskell.org/t/why-arent-modules-prefixed-their-package-name/14025/9 "2026-05-01T21:38:58Z")

</div>

Making unprefixed module names the default has allowed for much smoother migrations when modules enter or leave major libraries. Off the top of my head, I can think of package [`semigroups`](https://hackage.haskell.org/package/semigroups), which incubated `Data.Semigroup` and `Data.List.NonEmpty` before they entered `base`, and package [`attoparsec-aeson`](https://hackage.haskell.org/package/attoparsec-aeson), which holds `aeson`’s old `attoparsec`-based parse.

I think it’s a useful feature, and if you plan to strictly qualify your identifiers including by package name, you might need to think about how to get similar effects in your module system.

I’m a bit surprised by the amount of people who seem to be in favour of “if A depends on B depends on C, then A should be able to import from C” as a general principle. C could be an implementation detail of B, in which case A should have no right to import from C unless it also depends on it directly.
