2014-12-21 5 views
5

Ho un progetto con questa struttura:Raccontare cabala in cui il modulo principale è

foo.cabal 
src/ 
    Foo/ 
     Main.hs 

e parte del foo.cabal assomiglia a questo:

executable foo 
    main-is:    Foo/Main.hs 
    hs-source-dirs:  src 

Main.hs ha il nome del pacchetto Foo.Main . Quando lo costruisco, la cabala compila tutto ma non crea un eseguibile perché dice che non esiste un modulo principale.

Warning: output was redirected with -o, but no output will be generated 
because there is no Main module. 

Cosa sto facendo male?

[EDIT] Se si sposta Main su un livello e si modifica foo.cabal per leggere main-is: Main.hs, funziona. Quindi non posso avere un nome di modulo nidificato per Main?

risposta

9

Il modulo Main deve essere chiamato Main, non Foo.Main o altro. Se si desidera Foo.Main, quindi rinominarlo main in esso per qualcosa come defaultMain, poi fare un livello superiore Main modulo che imports Foo.Main (defaultMain) e definisce main = defaultMain, come ad esempio:

src/ 
    Foo/ 
     Main.hs 
    Main.hs 
foo.cabal 

Dove

-- src/Foo/Main.hs 
module Foo.Main 
    (defaultMain 
    ) where 

defaultMain :: IO() 
defaultMain = putStrLn "Hello, world!" 

E

-- src/Main.hs 
module Main where 

import Foo.Main (defaultMain) 

main :: IO() 
main = defaultMain 

In alternativa, è possibile mantenerlo Foo.Main.main e basta importarlo qualificato.

+3

[* Ogni programma Haskell completo deve definire principale nel modulo Main in package main. *] (Https://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/packages.html#package -main) –

+0

@maxtaldykin Grazie per la citazione. – bheklilr