使用 getArgs 或用户输入

Using getArgs or user input

Haskell 的新手,正在努力解决问题。我知道为什么我的代码不起作用,但我想不出解决方案。

目的是让用户通过参数提供文件名,或者,如果提供了 none,则提示用户输入数据。带有文件名的消息将打印到屏幕并处理文件。

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 HaskellLearn you Haskell 都无法让我渡过难关。我能找到的最接近的线程是 this one。非常感谢您的帮助。

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

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

这里的if-then-else语句有as条件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 <b><-</b> getArgs
    file <b><-</b> if null args
        then do putStr "File: " ; getLine
        else <b>pure (</b>head args<b>)</b>
    putStr "processing "
    putStrLn file
    writeFile file "some very nice text"