Haskell——是什么造就了';主要';独特的?

Haskell——是什么造就了';主要';独特的?,haskell,types,io,compiler-errors,main,Haskell,Types,Io,Compiler Errors,Main,使用此代码: main :: FilePath -> FilePath -> IO () main wrPath rdPath = do x <- readFile rdPath writeFile wrPath x 但是,当我将“main”的名称更改为其他名称时,文件会正确编译 main有什么独特之处?为什么它的类型必须是iot0?,因为语言规范 Haskell程序是模块的集合,按照惯例,其中一个模块必须被称为Main,并且必

使用此代码:

main :: FilePath -> FilePath -> IO ()
main wrPath rdPath = do x <- readFile rdPath
                        writeFile wrPath x
但是,当我将“main”的名称更改为其他名称时,文件会正确编译

main有什么独特之处?为什么它的类型必须是
iot0

,因为语言规范

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

与C、Java或C#中一样,
main
在某些上下文中是一个特殊标识符,指示程序应该从何处开始

在Haskell中,
main
被定义为具有类型
IO a
。您应该为函数指定一个不同的名称,或者如果您确实希望它作为起点,请更改其签名,并让它使用
getArgs


尽管您没有明确要求,
main
也很特别,因为它是Haskell程序中唯一可以(安全地)调用IO操作的函数。Haskell运行时将
main
视为特殊的。

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


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

获得的。根据定义,
main
是一个不接受参数并返回运行时丢弃的
IO a
类型值的函数。您的错误消息表明您的
main
不符合这些要求。确实如此,因为您的
main
接收两个参数

要访问命令行参数,请使用
System.Environment.getArgs