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

因此,try
ghc-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.