在没有主函数的情况下编译/测试Haskell

在没有主函数的情况下编译/测试Haskell,haskell,main,Haskell,Main,我在哈斯克尔做一项任务。但是,我正在使用的基本代码没有定义主功能,从任务的措辞来看,我相信我不必编写问题解决方案之外的任何代码。但是,当我尝试编译代码时,我收到错误: The IO function 'main' is not defined in module 'Main' Couldn't match expected type 'IO()' with actual type '[Int]' 我假设这是因为该函数没有主函数。但是,当我尝试编写自己的主函数时: main :: IO ()

我在哈斯克尔做一项任务。但是,我正在使用的基本代码没有定义主功能,从任务的措辞来看,我相信我不必编写问题解决方案之外的任何代码。但是,当我尝试编译代码时,我收到错误:

The IO function 'main' is not defined in module 'Main'
Couldn't match expected type 'IO()' with actual type '[Int]'
我假设这是因为该函数没有主函数。但是,当我尝试编写自己的主函数时:

main :: IO ()
main = solve easy // easy is an array
我得到一个错误:

The IO function 'main' is not defined in module 'Main'
Couldn't match expected type 'IO()' with actual type '[Int]'
solve函数的类型声明如下:

solve :: [Int] -> [Int]
因此它接受一个数组并返回一个数组。在编写
main
函数时,我做错了什么?即使我尝试将
main
的声明更改为以下内容:

main :: [Int]


我仍然无法将其编译。

首先:对于某些类型的
t
,函数
main
必须具有类型
iot
。当程序被执行时,由
main
定义的计算被执行,其结果(类型
t
)被丢弃

因此,特别是,您不能将
main
的类型设置为
[Int]
,也不能让编译器不抱怨

根据您是否希望看到解决简单案例的结果,您可以尝试以下操作之一:

如果你想看到结果:打印出来

main :: IO ()
main = putStrLn $ show (solve easy)
如果您对结果不感兴趣,请将其扔掉:

main :: IO ()
main = let solution = solve easy 
       in putStrLn ""

编辑:但是,请注意,如果您使用后者,那么(正如@yatima2975在评论中提到的)将不会对“轻松解决”部分进行评估。

如@G Philip所述,如果不使用正确的类型编写正确的
main
,您可以通过在终端中编写
ghci file.hs
在ghci中加载文件,或者通过调用ghci中的
:l file.hs

来添加其他答案:

您不需要编写
main
函数,并且仍然可以将文件编译成lib,最简单的方法就是给出一个模块名(不是
main
):

但当然,编译它可能不再有任何意义(因为您将无法运行它——当然,即使您没有指定要输出什么)

因此,在这种情况下,请将文件加载到ghci中:

ghci MyFile.hs
然后,每次更改代码中的某些内容时,您都可以在ghci中执行
:r
,以重新加载它

或者更好地设置您最喜欢的编辑器(emacs和vi非常简单,但sublime text和其他一些作品也很棒),为您提供集成的ghci-如果您感兴趣,您需要做什么来使用haskell模式设置emacs。

请考虑

main :: IO ()
main = do
    let res = solve easy // easy is an array
    return ()

其中,
return()
生成类型单位的结果,该结果以
main
的类型签名进行传输。注意
solve easy
绑定到
res
,不再使用。

参见Haskell中的
main
函数示例。我不同意这样的观点,即你的讲师要求你在没有
main
函数的情况下完成作业,除非他特别指示你这样做。多谢了,print语句解决了我们的问题。
easy
不是数组,而是列表。:)
main
必须是
::IO t
,并且
[Int]
绝对不是
IO[Int]
只要在声明开始时说
print$
。另外,它是否需要编译?
putStrLn。show
与print相同,第二种解决方案只确保类型检查;也就是说,
解决方案
根本不进行评估@yatima2975:是的。当我写答案时,我不确定你的第二点,所以当时我没有提到。我现在将它添加到答案中。如果您想计算解决方案,但不想出于任何原因打印它,请使用
main=Control.Exception.evaluate(solve easy)>>return()
。注:这仅适用于whnf。