Haskell中的模块级测试
我和哈斯克尔越来越熟,目前正在为我在网上找到的某门课程写第三份“家庭作业”。家庭作业需要在名为Haskell中的模块级测试,haskell,Haskell,我和哈斯克尔越来越熟,目前正在为我在网上找到的某门课程写第三份“家庭作业”。家庭作业需要在名为Golf.hs的文件中呈现*,从模块Golf where开始。很好,这在语言中似乎是惯用的 然而,我已经习惯了以结尾的python模块,如果uuu name uuu==“uuu main uuu:,人们可以在模块上进行测试,包括在模块开发期间。ghc似乎对这种方法不满意: $ ghc Golf.hs -o Golf && ./Golf <no location info>:
Golf.hs
的文件中呈现*,从模块Golf where
开始。很好,这在语言中似乎是惯用的
然而,我已经习惯了以结尾的python模块,如果uuu name uuu==“uuu main uuu:
,人们可以在模块上进行测试,包括在模块开发期间。ghc
似乎对这种方法不满意:
$ ghc Golf.hs -o Golf && ./Golf
<no location info>: error:
output was redirected with -o, but no output will be generated
输出:
$ ghc Golf2.hs -o Golf2
[1 of 1] Compiling Golf ( Golf2.hs, Golf2.o )
Golf2.hs:6:5: warning: [-Wunused-matches] Defined but not used: ‘n’
Golf2.hs:8:1: warning: [-Wmissing-signatures]
Top-level binding with no type signature: main :: IO ()
<no location info>: error:
output was redirected with -o, but no output will be generated
because there is no Main module.
$ghc Golf2.hs-o Golf2
[1/1]编译高尔夫(Golf2.hs,Golf2.o)
Golf2.hs:6:5:警告:[-Wunused matches]已定义但未使用:“n”
Golf2.hs:8:1:警告:[-w缺少签名]
没有类型签名的顶级绑定:main::IO()
:错误:
已使用-o重定向输出,但不会生成任何输出
因为没有主模块。
ghci
是一个非常有用的学习工具
当您只有一个模块时,也很容易。启动ghci
,然后:l Golf.hs
。这将加载您的文件。然后您可以键入foo 342
并查看显示的“42”,或main
并查看“hello”。您可以编辑该文件,然后使用:reload
或:r
加载更改。对使用ghci
有很好的介绍
这比使用
ghc
或像cabal
这样的工具要简单一点,而且在学习基础知识的过程中,您真正需要的就是这些工具。ghci
是一个非常有用的学习工具
当你只有一个模块时,也很容易。启动ghci
,然后启动:l Golf.hs
。这将加载您的文件。然后您可以键入foo342
并查看显示的“42”,或main
并查看“hello”。您可以编辑文件,然后使用:reload
或:r
加载更改。对使用ghci
有很好的介绍
这比使用
ghc
或像cabal
这样的工具要简单一些,而且在学习基础知识的过程中,您真正需要的就是这些工具。如果您想使用ghc
-编译器(而不是它的交互式变体ghci
),您可以使用该选项
从文档中:
-main是⟨事情⟩代码>
Haskell中的一般规则是程序必须在模块main
中提供一个main函数。测试时,通常很方便
更改哪个函数是“main”函数,并且-main是
标志允许
你必须这样做。⟨事情⟩代码>可以是以下内容之一:
- 小写标识符
foo
。GHC假定主函数是main.foo
- 模块名称
A
。GHC假定主功能是A.main
- 限定名
A.foo
。GHC假定主函数是A.foo
因此,请尝试ghc-main是Golf2 Golf2.hs-o Golf2&./Golf2
如果您想使用ghc
-编译器(而不是其交互式变量ghci
),您可以使用该选项
从文档中:
-main是⟨事情⟩代码>
Haskell中的一般规则是程序必须在模块main
中提供一个main函数。测试时,通常很方便
更改哪个函数是“main”函数,并且-main是
标志允许
你必须这样做。⟨事情⟩代码>可以是以下内容之一:
- 小写标识符
foo
。GHC假定主函数是main.foo
- 模块名称
A
。GHC假定主功能是A.main
- 限定名
A.foo
。GHC假定主函数是A.foo
因此,tryghc-main是Golf2 Golf2.hs-o Golf2&./Golf2
我无法重现该错误。再现这种行为的最小Golf.hs
是什么?@Zeta我相信这是一个愚蠢的问题,可能我自己可以通过rtfm解决,但目前似乎有太多这样的问题。正如错误所说,您应该将模块重命名为Main
或从另一个主模块导入。您始终可以使用ghci中的:reload
重新加载模块。@dimid模块和文件的名称与作业分配一致。我希望保留简单的工作流“编写函数->使用测试数据编写调用->编译->运行->观察标准输出”<代码>重新加载
-在ghci
中加载模块是额外的步骤。编写一个单独的Main.hs
,导入Golf.hs
,是额外的步骤加上空间碎片。也许runghc
可以帮我。我从未使用过它,我无法重现那个错误。再现这种行为的最小Golf.hs
是什么?@Zeta我相信这是一个愚蠢的问题,可能我自己可以通过rtfm解决,但目前似乎有太多这样的问题。正如错误所说,您应该将模块重命名为Main
或从另一个主模块导入。您始终可以使用ghci中的:reload
重新加载模块。@dimid模块和文件的名称与作业分配一致。我希望保留简单的工作流“编写函数->使用测试数据编写调用->编译->运行->观察标准输出”<代码>重新加载
-在ghci
中加载模块是额外的步骤。编写一个单独的Main.hs
,导入Golf.hs
,是额外的步骤加上空间碎片。也许runghc
可以帮我。我从来没有用过它。这似乎是XY问题的一个经典例子。我在问如何构造模块以实现可测试性,最好的解决方案是ghci
。这似乎是一个经典的例子
$ ghc Golf2.hs -o Golf2
[1 of 1] Compiling Golf ( Golf2.hs, Golf2.o )
Golf2.hs:6:5: warning: [-Wunused-matches] Defined but not used: ‘n’
Golf2.hs:8:1: warning: [-Wmissing-signatures]
Top-level binding with no type signature: main :: IO ()
<no location info>: error:
output was redirected with -o, but no output will be generated
because there is no Main module.