2014-12-21 1 views
5

У меня есть проект с этой структурой:указал междусобойчик, где главный модуль

foo.cabal 
src/ 
    Foo/ 
     Main.hs 

и часть foo.cabal выглядит следующим образом:

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

Main.hs имеет имя пакета Foo.Main , Когда я создаю его, каббал компилирует все, но не создает исполняемый файл, поскольку он говорит, что нет основного модуля.

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

Что я делаю неправильно?

[EDIT] Если я перехожу на уровень вверх и меняю foo.cabal на main-is: Main.hs, он работает. Могу ли я иметь имя вложенного модуля для Main?

ответ

9

Модуль Main должен называться Main, а не Foo.Main или что-либо еще. Если вы хотите Foo.Main, а затем переименовать main в нем что-то вроде defaultMain, а затем сделать верхний уровень Main модуля, который imports Foo.Main (defaultMain) и определяет main = defaultMain, такие как:

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

Где

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

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

И

-- src/Main.hs 
module Main where 

import Foo.Main (defaultMain) 

main :: IO() 
main = defaultMain 

В качестве альтернативы, вы можете оставить его Foo.Main.main и просто импортируйте его.

+3

[* Всякая полная программа Haskell должна определять основной в модуле Main в главном пакете. *] (Https://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/packages.html#package -main) –

+0

@maxtaldykin Спасибо за цитату. – bheklilr