我正在Haskell工作。但是,我正在使用的基本代码没有定义主函数,并且根据赋值的措辞,我相信我不应该在解决问题之外编写任何代码。但是,当我尝试编译代码时,收到错误:
The IO function 'main' is not defined in module 'Main'
我认为这是因为该功能没有主要功能。但是,当我尝试编写自己的主函数时:
main :: IO ()
main = solve easy // easy is an array
我收到错误:
Couldn't match expected type 'IO()' with actual type '[Int]'
求解函数的类型声明如下:
solve :: [Int] -> [Int]
所以需要一个数组并返回一个数组。在编写main
函数时,我做错了什么?即使我尝试将main
的声明更改为:
main :: [Int]
或
main :: IO [Int]
我仍然无法进行编译。
答案 0 :(得分:7)
首先:对于某种类型main
,函数IO t
必须具有t
类型。执行程序时,执行由main
定义的计算,并将其结果(类型t
)丢弃; see here
因此,特别是,您不能将main
的类型设为[Int]
,并且编译器不会抱怨。
根据您是否想要查看解决简易案例的结果,您可以尝试以下方法之一:
如果你想看到结果:打印它们!
main :: IO ()
main = putStrLn $ show (solve easy)
如果您对查看结果不感兴趣,请将它们扔掉:
main :: IO ()
main = let solution = solve easy
in putStrLn ""
编辑:但是,请注意,如果您执行后者,那么(正如@ yatima2975在评论中提到的那样)"解决简单问题"部分将不进行评估。
答案 1 :(得分:7)
如果没有使用正确的类型编写正确的main
,如@G Philip所述,您可以通过在终端中编写ghci file.hs
或通过调用:l file.hs
来加载您在ghci中的文件在ghci里面。
答案 2 :(得分:5)
只是添加其他答案:
你不需要编写main
函数,仍然可以将文件编译成lib,最简单的方法就是给出一个模块名称(不是Main
):
module MyCode where
solve :: ...
但是当然编译它可能不再有任何意义(因为你将无法运行它 - 当然即使你还没有指定输出什么)。
所以在这种情况下,请将文件加载到ghci:
ghci MyFile.hs
然后每次在代码中更改某些内容时,您都可以在ghci中执行:r
重新加载。
或者甚至更好地设置你最喜欢的编辑器(emacs和vi非常容易,但是崇高的文本和其他一些很好的作品)给你集成的ghci - this explains你需要做什么来设置带有haskell的emacs-模式,如果你有兴趣。
答案 3 :(得分:0)
考虑
main :: IO ()
main = do
let res = solve easy // easy is an array
return ()
其中return ()
产生类型为Unit的结果,该结果以类型签名main
传达。注意solve easy
绑定到res
,但未进一步使用。