Вопрос по module, haskell, entry-point – Писать или не писать `модуль Main where` в Haskell

24

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

Вопрос в том:

  1. What's the difference between writing module Main where and not writing it?
  2. Which one is preferred?

Ваш Ответ

1   ответ
22

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

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.

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

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

Похожие вопросы