Unit testing 当测试文件定义为模块时,使用堆栈调用的hspec定义的测试将抛出错误

Unit testing 当测试文件定义为模块时,使用堆栈调用的hspec定义的测试将抛出错误,unit-testing,haskell,hspec,Unit Testing,Haskell,Hspec,我试图弄清楚为什么包含单元测试(定义为模块)的测试文件在使用stack build--test运行时失败 假设从头定义了一个简单的测试模块: 堆叠新的测试模块 cd测试模块 vim package.yaml#删除“executables”部分,添加“hspec”作为测试依赖项 按照Hspec文档中的“”说明,我修改了以下文件: 第一步:描述你想要的行为 --文件测试/Spec.hs 模块LibSpec在哪里 进口测试 导入库 main::IO() main=hspec$do 描述“划分”$do

我试图弄清楚为什么包含单元测试(定义为模块)的测试文件在使用
stack build--test
运行时失败

假设从头定义了一个简单的测试模块:

堆叠新的测试模块
cd测试模块
vim package.yaml#删除“executables”部分,添加“hspec”作为测试依赖项
按照Hspec文档中的“”说明,我修改了以下文件:

第一步:描述你想要的行为
--文件测试/Spec.hs
模块LibSpec在哪里
进口测试
导入库
main::IO()
main=hspec$do
描述“划分”$do
它“当第一个数除以第二个数时返回True”$
2`divides`4`应该是`True`
步骤2:编写一些代码
--文件src/Lib.hs
模块库(划分),其中
除法::整数->整数->布尔
除d n=rem n d=0
运行
stack build--test
会引发以下错误:

<no location info>: error:
    output was redirected with -o, but no output will be generated
because there is no Main module.

这与Hspec相关还是与堆栈相关?或者我遗漏了一些明显的东西?

这是哈斯克尔语言的一部分

Haskell程序是模块的集合,按照惯例,其中一个模块必须被称为
Main
,并且必须导出值
Main

允许使用仅包含模块主体的模块缩写形式。如果使用此选项,则假定标头为
模块主(Main),其中


Haskell 2010报告第5节(模块)


另请参阅cabal文档,关于
package.yaml
是其代理的配置,该字段包含测试/可执行文件:

main是
:(…)虽然文件名可能不同,但模块本身必须命名为main




GHC有一个选项
-main是MyModule.mymain
来覆盖此行为()。现在更令人困惑的是:p这非常令人困惑。是否有可能
runhaskell
(据我所知,它是
runghc
的别名,是运行Haskell程序而不编译它们的一种方式)提取调用的模块,并以某种方式用它覆盖
main IS
选项?肯定是的。