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

Compiling / testing Haskell without a main function

我正在 Haskell 完成作业。但是,我正在使用的基本代码没有定义 main 函数,而且从作业的措辞来看,我相信我不需要在解决问题的方法之外编写任何代码。但是,当我尝试编译我的代码时,我收到错误:

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]

所以它需要一个数组和 returns 一个数组。我在编写 main 函数时做错了什么?即使我尝试将 main 的声明更改为:

main :: [Int]

main :: IO [Int]

我仍然无法编译。

首先:函数 main 必须具有某种类型 t 的类型 IO t。当程序执行时,main定义的计算被执行,其结果(t类型)被丢弃; see here.

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

根据您是否想查看简单案例的求解结果,您可以尝试以下操作之一:

如果您想查看结果:打印出来!

main :: IO ()
main = putStrLn $ show (solve easy)

如果您对结果不感兴趣,请将其丢弃:

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

编辑:但是请注意,如果您执行后者,那么(正如@yatima2975 在评论中提到的那样) "solve easy" 部分将 被评估。

如@G Philip 所述,如果不编写具有正确类型的正确 main,您可以通过在终端中编写 ghci file.hs 或调用 :l file.hs 在 ghci 中。

补充一下其他答案:

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

module MyCode where

solve :: ...

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

所以在这种情况下,宁愿将文件加载到 ghci:

ghci MyFile.hs

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

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

考虑

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

其中 return () 产生一个类型为 Unit 的结果,该结果使用 main 的类型签名传送。注意 solve easy 绑定到 res,不再使用。