在 Haskell 文件中使用 main

Using main in a Haskell file

我已经使用 GHCI 在 haskell 中完成了一些编程,但是我们的下一个任务要求我们只使用 GHC 来编译和测试我们的代码。

由于 ghci 与 ghc 相比的工作方式,您显然需要使用 main 函数,而 ghc 会在您的代码中查找此函数。

我的问题是,如果 Haskell 促进类型安全并且没有副作用,除非在 IO 操作中,为什么任何 haskell 程序的主要部分必须是IO 动作?

如果我不理解一些基本的东西,请原谅我,我只是找不到任何最终解释这一点的资源。

我认为这很简单 - 最终,您需要每个程序都在顶层执行 IO - 否则您怎么知道它是否做了任何事情,或者 - 它会有多大用处?因此,您必须拥有控制台 I/O、网络 I/O、磁盘 I/O 或类似的东西。我不明白你如何解决这个问题。

简单地说,运行一个程序一个副作用。这就是顶级函数是 I/O 操作的原因。

理想的 Haskell 程序是一大块纯代码,周围有薄薄的 I/O "skin"。

如果您的 main 函数不是 IO 操作,那么它所能做的就是产生一个结果。由于 Haskell 是惰性的,这(通常)意味着它只是产生将执行计算的承诺,但在需要使用它之前不会计算它。由于确保某些东西被计算的通常方法是打印出那个值,或者通过网络发送它,将它保存到磁盘,或者将它用于某种其他类型的 IO,你的结果将不会被计算,程序只会出口。想象一个像

这样的假程序
main :: Int
main = 1 + 1

假设您可以编译 运行 这个,您希望发生什么?没有打印任何东西,没有任何东西要求 main 的结果,Haskell 所能做的就是创建 1 + 1 将在某个时候计算然后退出程序的承诺。基本上,如果没有 IO,您无法在顶层做任何有趣的事情,并且由于我们希望程序做有趣的事情,我们需要我们的顶层是一个 IO 动作。