用参数调用main函数

use*_*428 15 haskell

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

main = do x <- readFile "/tmp/foo.txt"
      putStr x
Run Code Online (Sandbox Code Playgroud)

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

main s = do x <- readFile s
        putStr x
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joa*_*ner 17

哈斯克尔报告指定main功能总是有型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"
Run Code Online (Sandbox Code Playgroud)

  • 是的,你可以,但省略括号,即写`:main/tmp/foo.txt`(就像你传递命令行参数一样). (4认同)

Ahm*_*sud 8

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

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

import System.Environment

main = do x <- getArgs; print x
Run Code Online (Sandbox Code Playgroud)

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

Haskell wiki有一个关于该主题的优秀教程.