在Haskell文件中使用main

时间:2015-04-23 13:47:27

标签: haskell ghc side-effects

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

由于ghci与ghc相比如何工作,你显然需要使用main函数,ghc会在你的代码中查找这个函数。

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

请原谅我,如果我不理解一些基本的东西,我就无法找到最终解释这一点的资源。

3 个答案:

答案 0 :(得分:12)

如果您的main功能不是IO操作,那么它所能做的就是产生一个结果。由于Haskell是惰性的,这(通常)意味着它只产生一个计算将被执行的承诺,但它不会计算它直到需要使用它。由于确保计算某些内容的通常方法是打印该值,或通过网络发送它,将其保存到磁盘,或将其用于其他类型的IO,您的结果将无法计算,程序将只是简单出口。想象一下假的程序,如

main :: Int
main = 1 + 1

假设你可以编译并运行它,你会发生什么?没有任何内容被打印,没有任何东西要求main的结果,Haskell可以做的就是创建承诺1 + 1将在某个时刻计算然后退出程序。基本上,如果没有IO,你就无法在顶级做任何有趣的事情,因为我们希望程序做有趣的事情,我们需要我们的顶级成为IO动作。

答案 1 :(得分:4)

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

理想的Haskell程序是一大块纯代码,具有薄的I / O"皮肤"在它周围。

答案 2 :(得分:2)

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