Default module header `module Main where`

Ben Millwood haskell at benmachine.co.uk
Wed May 24 13:50:12 UTC 2017


On Tue, May 16, 2017 at 10:18:51AM -0400, Joachim Breitner wrote:
>Currently, the report states
>
>    An abbreviated form of module, consisting only of the module body,
>    is permitted. If this is used, the header is assumed to be ‘module
>    Main(main) where’.
>
>I propose to change that to
>
>    An abbreviated form of module, consisting only of the module body,
>    is permitted. If this is used, the header is assumed to be ‘module
>    Main where’.

>I don’t see any downsides. When compiling to a binary, implementations
>are still able to detect that a Main module is not imported by any
>other module and only the main function is used, and optimize as if
>only main were exported.

Initially I was concerned that this proposal would implicitly export 
everything from Main, which would then prevent compilers from warning 
about unused values, since they can't tell if seemingly-unused things 
are in fact being exported for use elsewhere (perhaps by a program that 
is not currently being compiled, so looking at what exported values are 
used elsewhere is not a solution).

Then I started wondering if a standards-compliant Haskell program can 
ever import anything from a module called Main (because module names 
should be unique across a program, and there should be a Main module 
at the root of the dependency graph).

Then I started wondering about a Main module that was mutually recursive 
with another module.

I've ended up uncertain, so I'll just throw it out there: are unused 
value warnings affected by this proposal?


More information about the Haskell-prime mailing list