我有一个这种结构的项目:
foo.cabal
src/
Foo/
Main.hs
Run Code Online (Sandbox Code Playgroud)
和foo.cabal的一部分看起来像这样:
executable foo
main-is: Foo/Main.hs
hs-source-dirs: src
Run Code Online (Sandbox Code Playgroud)
Main.hs具有包名称Foo.Main
.当我构建它时,cabal编译所有内容但不创建可执行文件,因为它说没有主模块.
Warning: output was redirected with -o, but no output will be generated
because there is no Main module.
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
[编辑]如果我将Main移动到一个级别并更改foo.cabal以读取main-is: Main.hs
它的工作原理.那么我可以没有Main的嵌套模块名称吗?
Main
必须调用该模块Main
,而不是Foo.Main
其他任何东西.如果你愿意Foo.Main
,然后将main
其重命名为defaultMain
,然后创建一个顶级Main
模块imports Foo.Main (defaultMain)
并定义main = defaultMain
,例如:
src/
Foo/
Main.hs
Main.hs
foo.cabal
Run Code Online (Sandbox Code Playgroud)
哪里
-- src/Foo/Main.hs
module Foo.Main
( defaultMain
) where
defaultMain :: IO ()
defaultMain = putStrLn "Hello, world!"
Run Code Online (Sandbox Code Playgroud)
和
-- src/Main.hs
module Main where
import Foo.Main (defaultMain)
main :: IO ()
main = defaultMain
Run Code Online (Sandbox Code Playgroud)
或者,你可以保留它Foo.Main.main
,只需导入它合格.