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

时间:2015-04-07 05:15:32

标签: haskell main

我正在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]

我仍然无法进行编译。

4 个答案:

答案 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,但未进一步使用。