"module [...] is defined in multiple files" 来自 Haskell 编译的错误

"module [...] is defined in multiple files" error from Haskell compilation

当我使用 -Wall 选项编译时出现以下错误。

ghc -o -Wall polycake polycake.hs

当我不使用该选项时,我的代码可以正常编译并按预期运行。这是什么意思?

<no location info>: error:
    module ‘main:Polycake’ is defined in multiple files: polycake.hs
                                                         polycake.hs

-o 选项期望输出文件名作为下一个参数——它不关心该参数是否以破折号开头。所以 -o -Wall 将输出文件名设置为 -Wall (实际上并没有启用警告)。

所以剩下的两个参数是 polycakepolycake.hsghc 解释为输入文件名。当输入文件名不存在且未以 .hs 扩展名结尾时,ghc 将尝试添加该扩展名。所以 ghc polycake polycake.hs 会尝试编译 polycake.hs 两次。这会导致你的错误。

PS:输出文件名默认为不带扩展名的输入文件名,因此在这种情况下根本不需要-o选项。