Hi Cafe,

Let's say we have a module like

module Foo where

foo, bar :: String -> Something
...

and use it elsewhere as

import qualified Foo as F
...
F.foo ...

This is almost just if we had a data type defined as

data FooModule = FooModule { foo :: String -> Something, bar :: String -> Something }

together with a singleton `f : :FooModule` and referenced it as f.foo, f.bar etc.

Has some language explored this idea of making modules explicit as language-level objects? It seems that there could be some interesting possibilities, such as:

- Abstract modules (just a definition of the data type). Then
- Being able to replace a module with a different one (like a fake one for testing).
- Polymorphic modules that could be instantiated for specific types.

Thanks,
Petr