在没有主函数的情况下编译/测试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。