用参数调用main函数

时间:2013-06-28 22:04:37

标签: haskell

我从文件中读取时遇到问题。每当我需要从文件中读取时,我都会这样做:

main = do x <- readFile "/tmp/foo.txt"
      putStr x

但是现在我希望这条道路成为一个论点,所以我尝试了下面的

main s = do x <- readFile s
        putStr x

它不起作用。我看到以下错误:

Couldn't match expected type `IO t0'
            with actual type `FilePath -> IO ()'
In the expression: main
When checking the type of the function `main'

我的作业是编写一个程序,程序必须包含一个main函数(因为它将被编译),而call的参数必须包含文件的名称。我不确定我是否理解这一点,我不知道如何继续。我会感激一些帮助。

2 个答案:

答案 0 :(得分:17)

main IO t函数始终具有类型t,(对于某些类型System.Environment将被忽略)因此永远不会接受正常的函数参数,所以这不是正确的方法。

您正在寻找函数Haskell report specifies(您必须为其导入模块String。它会将传递给您的程序的参数作为import System.Environment main = do args <- getArgs case args of [file] -> do x <- readFile file putStr x _ -> putStrLn "Wrong number of arguments" 的列表返回。

所以你的代码看起来像是:

{{1}}

答案 1 :(得分:9)

在Haskell中,由于Haskell绑定其启动方式并保持一致,因此不会向main函数赋予参数。您需要使用System.Environment.getArgs

特别是,因为Haskell是纯函数式语言,main是一个monadic动作,用于组织由软件执行的副作用 - 计算 - 由main计算的结果被丢弃,因为在函数式语言中,你与环境分离计算并且只与它作为副作用相互作用。

实施例

import System.Environment

main = do x <- getArgs; print x

这将打印出您在命令行上输入的内容。

The Haskell wiki has an excellent tutorial on the topic.