Haskell IO :打印命令行参数



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

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]

所以linedo { 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,但StringShow a => [a]都有一个Show实例,print可以用来从中String

最新更新