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