2013-07-26 15 views
6

I'am próbuje skompilować bardzo mały kod Haskell z GHC:Dlaczego nie mogę skompilować się z GHC, jeśli kod zawiera definicję modułu?

module Comma where 

import System.IO 

main = do 
    contents <- getContents 
    putStr (comma contents) 

comma input = 
    let allLines = lines input 
     addcomma [x] = x 
     addcomma (x:xs) = x ++ "," ++ (addcomma xs) 
     result = addcomma allLines 
    in result 

Polecenie używam skompilować to:

ghc --make Comma.hs

i jestem coraz to odpowiedź:

[1 z 1] Kompilacja przecinek (Comma.hs, Comma.o)

Żaden plik nie jest generowany i nie ma komunikatów ostrzegawczych lub komunikatów o błędach.

Jeśli komentarz linię "moduł Przecinek gdzie" z kodu kompiluje poprawnie:

[1 1] Kompilacja Main (Comma.hs, Comma.o) Łączenie Przecinek ...

Nie rozumiem, co się dzieje. Używam ghc 7,4,1 (kompilator Haskella, wersja 7.4.1, etap 2 uruchamiany przez GHC w wersji 7.4.1) i Linux Ubuntu.

Doceniam jeśli ktoś mógłby powiedzieć, dlaczego nie skompilować z definicji modułu

+2

Użyj flagi '-main-is',' ghc -main-is Comma Comma' (nie potrzebujesz '--make' z ghc od wersji 7.0). –

+2

Na marginesie twój program jest równoważny z tym: 'main = interact $ intercalate", ". linie " – chirlu

Odpowiedz

1

Jeśli masz main definicji w pliku i chcesz go skompilować do pliku wykonywalnego trzeba może mieć tylko module Main where.

9

GHC kompiluje funkcję Main.main jako punkt wejścia pliku wykonywalnego. W przypadku pominięcia deklaracji modułu zostanie automatycznie wstawiony Module Main where.

Ale gdy wyraźnie nazwiesz to coś innego niż Main ghc nie znajdzie punktu wejścia.

Mój zwykły tok pracy polega na użyciu ghci (lub ghci + emacs) zamiast tych fragmentów, które pozwolą ci całkowicie ominąć ten problem. Alternatywnie możesz skompilować z -main-is Comma, aby jawnie powiedzieć ghc, aby użył modułu Comma.

5

No plik jest generowany

Czy jesteś pewien? Spodziewam się, że wygenerowane zostaną co najmniej Comma.o i Comma.hi. Pierwsza zawiera skompilowany kod gotowy do połączenia z plikiem wykonywalnym, a drugi zawiera informacje o interfejsie, których używa ghc do sprawdzania modułów, które importują moduł Comma.

Jednak ghc będzie tylko połączyć skompilowane moduły do ​​pliku wykonywalnego, jeśli istnieje funkcja główna. Domyślnie oznacza to funkcję o nazwie main w module o nazwie Main. Jeśli nie zostanie umieszczona jawna nazwa modułu, zostanie przyjęta nazwa Main i dlatego Twój test działa po usunięciu linii module Comma where.

Aby skompilować oraz link plik Comma.hs można użyć module Main where zamiast module Comma where, czy można użyć flagi -main-is powiedzieć GHC że ma być główną funkcją:

ghc --make -main-is Comma Comma.hs 

Lub:

ghc --make -main-is Comma.main Comma.hs