首页 > 解决方案 > 使用 getArgs 或用户输入

问题描述

刚接触 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 HaskellLearn you Haskell都无法让我大吃一惊。我能找到的最接近的线程是这个。非常感谢您的帮助。

标签: haskellcommand-line-arguments

解决方案


让我们分析 的类型file

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

这里 if--语句有 as 条件then,它确实是 a ,所以我们是安全的。但该部分具有 as 类型。所以 Haskell 的理由应该是一个,但它不是:它是一个s 的列表,所以。elsenull argsBoolthenIO Stringargs[IO String]String[String]

后来又出现了另一个问题:你使用fileas 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"

推荐阅读