17

我在读取文件时遇到问题。每当我需要从文件中读取数据时,我都会执行以下操作:

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'

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

4

2 回答 2

19

Haskell 报告指定函数main始终具有 type IO t,(对于某些将被忽略的类型t),因此从不采用普通函数参数,因此这不是正确的方法。

您正在寻找该函数getArgs(您必须为此导入模块System.Environment。它返回作为Strings 列表传递给您的程序的参数。

所以你的代码看起来像:

import System.Environment
main = do
    args <- getArgs
    case args of 
      [file] -> do
        x <- readFile file
        putStr x
      _ -> putStrLn "Wrong number of arguments"
于 2013-06-28T22:06:41.473 回答
9

在 Haskell 中,由于 Haskell 绑定其启动并保持一致的方式,参数没有提供给 main 函数。你需要使用System.Environment.getArgs.

特别是,因为 Haskell 是一种纯函数式语言,main它是一种单子动作,它组织软件执行的副作用计算——计算的结果main被丢弃,因为在函数式语言中,你与计算环境分离,并且只有作为副作用与之交互。

例子

import System.Environment

main = do x <- getArgs; print x

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

Haskell wiki 有关于该主题的优秀教程。

于 2013-06-28T22:07:24.293 回答