在没有 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
,不再使用。
我正在 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
,不再使用。