2012-06-20 13 views
24

Specyfikacja Haskell 98 mówi, że punkt wejścia programu, a mianowicie funkcja main, powinien znajdować się w module o nazwie Main, zgodnie z konwencją. Jednak nawet jeśli nie napiszesz module Main where w górnej części pliku, w którym piszesz main, kod źródłowy kompiluje i wydaje się działać poprawnie, gdy używasz GHC.Aby napisać lub nie napisać `module Main gdzie` w Haskell

Pytanie brzmi:

  1. Jaka jest różnica między pisania module Main where i nie pisząc to?
  2. Który z nich jest preferowany?

Odpowiedz

22

Nie ma wielkiej różnicy, module Main (main) where byłaby definicją domyślną, gdy nie określisz nagłówka samodzielnie. Z Haskell 98 Report:

skróconej formie modułu, składający się wyłącznie z korpusu modułu, jest zabronione. Jeśli to jest używane, przyjmuje się, że nagłówek ma być module Main(main) where.

Wolałbym definicję jawną od domyślnej, ale dla Main.hs jest to mniejsza preferencja.

+8

Różnica polega na tym, że bez nagłówka modułu wyeksportowane jest tylko 'główne', ale z' głównym modułem 'gdzie eksportowana jest każda definicja najwyższego poziomu. Wydaje się, że twoje oczy widziały 'moduł Główny (główny) gdzie' gdzie nie ma listy eksportu;) –

+4

Ważne jest posiadanie listy eksportu '(main)', ponieważ to pozwala kompilatorowi zoptymalizować więcej. – augustss

+0

@DanielFischer @augustss Nie mogę znaleźć żadnej dokumentacji, która by to wspierała. GHC wydaje się nie robić tego rozróżnienia podczas budowania pliku wykonywalnego; wydaje się, że robi to samo optymalizowanie i łączenie dla 'module Main (main) gdzie' jako 'module Main where' również. – jdeseno

Powiązane problemy