使用getArgs或用户输入

时间:2018-05-23 11:55:18

标签: haskell command-line-arguments

Haskell的新手并且遇到问题。我知道为什么我的代码不起作用,但我无法找到解决方案。

用户可以通过参数提供文件名,如果没有提供,则提示用户输入数据。带有文件名的消息将打印到屏幕上并处理文件。

import System.Environment
main = do
    args <- getArgs
    let file = if null args
        then do putStr "File: " ; getLine
        else head args
    putStr "processing"
    putStrLn file
    writeFile file "some very nice text"

当然,代码是错误的,但却展示了我一直在努力的逻辑。 Happy Learn Haskell 了解你的Haskell 都不能让我超越驼峰。我能找到的最接近的线程是this one。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

让我们分析一下file的类型:

let file = if null args
    then do putStr "File: " ; getLine
    else head args

此处if - then - else语句的条件为null args,确实是Bool,因此我们很安全。但then部分的类型为IO String。因此,Haskell认为args应该是[IO String],但事实并非如此:它是String的列表,因此[String]

稍后会出现另一个问题:您使用file作为String,但事实并非如此:它仍然是IO String

有几种方法可以解决它。可能最小的变化是使用purehead args包装回IO,并使用let语句替换<-子句:

import System.Environment

main = do
    args <- getArgs
    file <- if null args
        then do putStr "File: " ; getLine
        else pure (head args)
    putStr "processing "
    putStrLn file
    writeFile file "some very nice text"