告诉主要模块所在的cabal

jay*_*bee 7 haskell cabal

我有一个这种结构的项目:

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的嵌套模块名称吗?

bhe*_*ilr 9

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,只需导入它合格.

  • [*每个完整的Haskell程序必须在包主模块主要定义main*](https://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/packages.html#package-main) (3认同)