2013-07-26 3 views
6

I'am tenta di compilare un piccolo codice Haskell con GHC:Perché non riesco a compilare con GHC se il codice contiene la definizione del modulo?

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 

Il comando sto usando per compilare è:

ghc --make Comma.hs

e sto ottenendo questa risposta:

[1 di 1] la compilazione Comma (Comma.hs, Comma.o)

Nessun file è stato generato e non sono presenti messaggi di avviso o errore.

Se io commento la riga "Modulo Comma dove" dal codice si compila correttamente:

[1 di 1] La compilazione principale (Comma.hs, Comma.o) Linking Comma ...

Non capisco cosa sta succedendo. Sto usando ghc 7,4,1 (Glasgow Haskell Compiler, Versione 7.4.1, fase 2 avviata da GHC versione 7.4.1) e ubuntu linux.

mi rendo conto se qualcuno potrebbe dire perché non compilare con la definizione del modulo

+2

Utilizzare il flag '-main-is',' ghc -main-is Comma Comma' (non è necessario '--make' con ghc da 7.0). –

+2

Per inciso, il tuo programma è equivalente a questo: 'main = interact $ intercalate", ". linee' – chirlu

risposta

1

Se si dispone di una definizione main nel file e si desidera compilare a un file eseguibile è necessario può avere solo module Main where.

9

GHC compila la funzione Main.main come punto di ingresso di un file eseguibile. Quando ometti la dichiarazione del modulo, Module Main where è implicitamente inserito per te.

Ma quando si specifica esplicitamente un nome diverso da Main ghc non trova un punto di ingresso.

Il mio solito flusso di lavoro è quello di utilizzare ghci (o ghci + emacs) invece per questi frammenti che consentono di ignorare completamente questo problema. In alternativa, è possibile compilare con -main-is Comma per indicare esplicitamente a ghc di utilizzare il modulo Virgola.

5

Nessun file viene generato

Sei sicuro? Mi aspetto che almeno Comma.o e Comma.hi vengano generati. Il primo contiene il codice compilato pronto per essere collegato in un file eseguibile e il secondo contiene le informazioni di interfaccia che ghc utilizza per i moduli typecheck che importano il modulo Comma.

Tuttavia, ghc solo collega i moduli compilati in un file eseguibile se è presente una funzione principale. Per impostazione predefinita, si intende una funzione denominata main in un modulo denominato Main. Se non si inserisce un nome modulo esplicito, viene assunto il nome Main, ed è per questo che il test funziona quando si elimina la riga module Comma where.

Per compilare e collegamento il file Comma.hs è possibile utilizzare module Main where al posto di module Comma where, oppure è possibile utilizzare il flag -main-is dire GHC che è quello di essere la funzione principale:

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

Oppure:

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