我有这个程序,它只打印出命令行参数。
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'
因为
getArgs :: IO [String]
所以line
do { line <- getArgs ; ... }
是
line :: [String]
但putStrLn :: String -> IO ()
期待一个String
论点,而不是String
列表。
同样,read :: Read a => String -> a
也期望一个String
参数,而不是String
参数的列表。
另请参阅:do
表示法类型指南,鲜艳色彩。
>print
从你给出的任何参数中产生一个String
。
另一方面,putStrLn
期望将String
作为论据。(确实,print = putStrLn . show
。同样,read
期望将String
作为参数;实际上,当您尝试执行的是序列化列表时,它会反序列化。
getArgs
有类型IO [String]
,这意味着line
不是String
,但String
和Show a => [a]
都有一个Show
实例,print
可以用来从中String
。