Haskell - 什么使'主'独特?

pat*_*ckm 7 io haskell types program-entry-point compiler-errors

使用此代码:

main :: FilePath -> FilePath -> IO ()
main wrPath rdPath = do x <- readFile rdPath
                        writeFile wrPath x
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Couldn't match expected type 'IO t0'
            with actual type 'FilePath -> FilePath -> IO()
Run Code Online (Sandbox Code Playgroud)

但是当我将'main'的名称更改为其他名称时,文件会正确编译.

什么是主要的独特之处,为什么它的类型必须是IO t0

Cat*_*lus 22

因为语言规范是这样说的.

Haskell程序是模块的集合,按照惯例,必须调用其中一个模块Main并且必须导出该值main.程序的值是main模块中标识符的值Main,它必须是IO t某种类型的类型计算t(参见第7章).当程序执行时,执行计算main,并t丢弃其结果(类型).


Tho*_*son 5

正如 GolezTrol 所说,所有程序都需要知道调用函数时开始执行哪个符号。许多脚本语言不需要(或只是不需要)main例程,因为它们可以将语句放置在顶层。Haskell、C 和许多其他语言的情况并非如此 - 这些语言需要一个起始位置,并且按照惯例,该位置就是函数main(根据 Haskell 规范 - 请参阅 Cat 的答案)。

请注意,Haskellmain不接受与程序参数相对应的任何参数 - 这些参数是通过System.Environment.getArgs.