Haskell 为什么main';返回的不是退出代码吗? C和C++允许我们从代码>主< /代码>返回退出代码。为什么哈斯克尔不这么做?在我看来,这很简单;只需要main::IO Int而不是IO t

Haskell 为什么main';返回的不是退出代码吗? C和C++允许我们从代码>主< /代码>返回退出代码。为什么哈斯克尔不这么做?在我看来,这很简单;只需要main::IO Int而不是IO t,haskell,exit-code,Haskell,Exit Code,我意识到以下情况不会像C程序员所期望的那样: main :: IO Int main = do return 1 -- Execution continues, thanks to (>>) putStrLn "Unreachable?" return 2 -- Exit code 2? 这种退出代码可能很棘手,但到底有多棘手呢?对我来说,似乎比导入系统更好。退出这不值得。99%的Has

我意识到以下情况不会像C程序员所期望的那样:

main :: IO Int
main = do
    return 1                   -- Execution continues, thanks to (>>)
    putStrLn "Unreachable?"
    return 2                   -- Exit code 2?

这种退出代码可能很棘手,但到底有多棘手呢?对我来说,似乎比导入
系统更好。退出

这不值得。99%的Haskell程序只返回0,这是纯样板。当异常(即
System.Exit
利用的异常)已经完成同样的工作时,它为错误添加了一个额外的非常特定的通道。您实际需要多久导入一次
System.Exit
以获得细粒度的返回代码?

以支持“样板”声明:Java具有
void main(String[]args)
,这样程序员就不必添加
返回0在大多数时间结束时。如果需要其他返回代码,可以调用库例程。C++更为特殊,因为<代码> int()/<代码>有隐式<代码>返回0;<代码>结尾处,此隐式返回仅添加到
main
main
已经不需要具有类型
IO()
。它可以是任何类型,
IO
作为顶级构造函数。使用返回值而不是丢弃它只会有点糟糕。我认为更大的问题是退出代码在不同的操作系统中改变了含义,可以想象一个操作系统使用完全不同的退出状态类型。它不是程序的基本可移植部分。