【问题标题】:Using getArgs or user input使用 getArgs 或用户输入
【发布时间】:2018-05-23 11:55:18
【问题描述】:

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 都无法让我克服困难。我能找到的最接近的线程是this one。非常感谢您的帮助。

【问题讨论】:

    标签: haskell command-line-arguments


    【解决方案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],但它不是:它是 Strings 的列表,所以 [String]

    后来又出现了一个问题:你使用file作为String,但它不是:它仍然是IO String

    有几种方法可以修复它。可能最小的更改是使用purehead args 包装回IO,并使用&lt;- 语句替换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"

    【讨论】:

    • 你好!这有参考吗? (搜索“haskell pure”充其量是不切实际的)
    • @Bill:pure 函数有点神秘。 IOApplicative 类型,因此您可以使用 pure 将元素包装在 IO 对象中(但您可以使用 pure 将元素包装在 Maybe[] 等中。以及)。
    • 例如对于Maybe 类型,如果你使用pure 14 :: Maybe Int,你会得到一个Just 14。对于列表,您会得到一个单例列表(pure 25 :: [Int][25])。对于IO,您基本上会得到一个“无操作”,它的输出是pure 函数的参数。
    • @Bill 如果你想在不需要做大量研究的情况下取得进步,我推荐The IO Monad for People who Simply Don't Care。如果您想在继续之前进行大量研究并深入了解,我推荐You Could Have Invented Monads! (And Maybe You Already Have.)
    • 在这种情况下使用pure 而不是return 有什么特别的原因吗?我想对于来自 return 意味着别的语言的人来说,这不会那么混乱。但据我所见,return 历史上在这里更常用,特别是在教程/书籍/等中,所以我认为这是人们更容易识别的。我猜pure 总体来说更好,因为它更……好吧,总体而言,但如果你从一开始就知道你就在 IO 中,那么这并不是一个重要的因素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多