Писать или не писать `module Main where` в Haskell

Спецификация Haskell 98 гласит, что точка входа программы, а именно функция main, по соглашению должна находиться в модуле с именем Main. Однако, даже если вы не пишете module Main where в верхней части файла, в который записываете main, исходный код компилируется и работает правильно, когда вы используете GHC.

Вопрос в том:

  1. В чем разница между написанием module Main where и отказом от него?
  2. Какой из них предпочтительнее?

person Pteromys    schedule 20.06.2012    source источник


Ответы (1)


На самом деле разницы нет, module Main (main) where будет неявным определением, если вы сами не укажете заголовок. Из отчета Haskell 98:

Допускается сокращенная форма модуля, состоящая только из тела модуля. Если это используется, предполагается, что заголовок будет module Main(main) where.

Я бы предпочел явное определение неявному, но для Main.hs это второстепенное предпочтение.

person jdeseno    schedule 20.06.2012
comment
Разница в том, что без заголовка модуля экспортируется только main, а с module Main where экспортируется каждое определение верхнего уровня. Кажется, ваши глаза видели module Main(main) where там, где не было списка экспорта;) - person Daniel Fischer; 20.06.2012
comment
Важно иметь список экспорта (main), потому что это позволяет компилятору оптимизировать больше. - person augustss; 20.06.2012
comment
@DanielFischer @augustss Я не могу найти никакой документации, подтверждающей это. GHC, похоже, не делает этого различия при сборке исполняемого файла; похоже, он выполняет ту же оптимизацию и связывание для module Main(main) where, что и module Main where. - person jdeseno; 20.06.2012
comment
Что касается поведения экспорта, см. haskell.org/onlinereport/haskell2010/ и сразу абзац до. Что касается оптимизации, если экспортируется только main, компилятор может исключить все другие определения путем встраивания, если это кажется правильным. Если другие определения в Main также экспортируются, символы для них должны быть сгенерированы в объектном файле. Компилятор может по-прежнему оптимизировать main так же, как если бы был экспортирован только main, но он также может делать меньше встраивания, потому что это приведет к дублированию слишком большого количества кода. - person Daniel Fischer; 20.06.2012
comment
@DanielFischer Спасибо. Немного потыкается с ghc --show-iface, и все обретает смысл. - person jdeseno; 20.06.2012