【问题标题】:Haskell IO : Printing Command Line ArgumentsHaskell IO:打印命令行参数
【发布时间】:2026-02-07 15:40:01
【问题描述】:

我有这个程序,它只打印出命令行参数。

echoArgs :: IO ()
echoArgs = do
        line <- getArgs
        print line

我想知道的是为什么我打字时会失败:

echoArgs :: IO ()
echoArgs = do
            line <- getArgs
            putStrLn line

以及为什么当我将其更改为时它不起作用:

echoArgs :: IO String
    echoArgs = do
                line <- getArgs
                let line' = read line :: String
                putStrLn line'

【问题讨论】:

  • 注意您收到的错误消息有助于确定问题所在。

标签: haskell io command-line-arguments monads do-notation


【解决方案1】:

print 产生 String 从你给出的任何参数。

putStrLn,另一方面,期望 String 作为参数。 (实际上,print = putStrLn . show。)同样,read 期望 String 作为参数;实际上,当您尝试序列化列表时,它反序列化

getArgs 的类型为IO [String],这意味着line 不是String,但StringShow a =&gt; [a] 都有一个Show 实例,print 可以使用它制作一个String

【讨论】:

    【解决方案2】:

    因为

    getArgs :: IO [String]
    

    所以line 中的do { line &lt;- getArgs ; ... }

    line    ::    [String]
    

    putStrLn :: String -&gt; IO () 需要一个String 参数,不是Strings 的列表。

    同样,read :: Read a =&gt; String -&gt; a 也需要 String 参数,不是Strings 参数的列表。

    另请参阅:The Guide to Types in do-notation, In Vivid Colors

    【讨论】: