Haskell IO:打印命令行参数

Haskell IO : Printing Command Line Arguments

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

1
2
3
4
echoArgs :: IO ()
echoArgs = do
        line <- getArgs
        print line

我想知道的是为什么我输入时会失败:

1
2
3
4
echoArgs :: IO ()
echoArgs = do
            line <- getArgs
            putStrLn line

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

1
2
3
4
5
echoArgs :: IO String
    echoArgs = do
                line <- getArgs
                let line' = read line :: String
                putStrLn line'


因为

1
getArgs :: IO [String]

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

1
line    ::    [String]

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

同样,read :: Read a => String -> a 也需要一个 String 参数,而不是 String 参数的列表。

另请参阅:do 表示法中的类型指南,生动的颜色。


print 从你给它的任何参数中产生一个 String

另一方面,

putStrLn 期望 String 作为参数。 (确实,print = putStrLn . show。)类似地,read 需要一个 String 作为参数。实际上,当您尝试序列化列表时,它会反序列化。

getArgs 具有 IO [String] 类型,这意味着 line 不是 String,但 StringShow a => [a] 都有一个 Show 实例,print 可以使用该实例来生成 String 摆脱它。