在Haskell文件中使用main

Bra*_*ley 4 haskell side-effects ghc

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

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

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

请原谅我,如果我不理解一些基本的东西,我就找不到任何最终解释这个问题的资源.

bhe*_*ilr 13

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

main :: Int
main = 1 + 1
Run Code Online (Sandbox Code Playgroud)

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

  • @Bradley我建议用你正在努力解决的具体代码问一个单独的问题,我不知道没有上下文这个错误意味着什么. (2认同)