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 , 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.
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?
f-a
May 1, 2026, 4:53pm
3
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 .
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.
ashokkimmel:
What problems?
This kind of breakage, for example:
opened 08:17AM - 28 Apr 26 UTC
```
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 ?
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.
ram was not a drop-in replacement for memory, it turns out. Better if this were discovered earlier, I think.
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”
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 , which incubated Data.Semigroup and Data.List.NonEmpty before they entered base, and 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.