Rah*_*hat 0 io monads haskell command-line-arguments do-notation
我有这个程序,它只是打印出命令行参数。
echoArgs :: IO ()
echoArgs = do
line <- getArgs
print line
Run Code Online (Sandbox Code Playgroud)
我想知道的是为什么当我输入时会失败:
echoArgs :: IO ()
echoArgs = do
line <- getArgs
putStrLn line
Run Code Online (Sandbox Code Playgroud)
以及为什么当我将其更改为以下内容时它不起作用:
echoArgs :: IO String
echoArgs = do
line <- getArgs
let line' = read line :: String
putStrLn line'
Run Code Online (Sandbox Code Playgroud)
因为
getArgs :: IO [String]
Run Code Online (Sandbox Code Playgroud)
所以line在do { line <- getArgs ; ... }为
line :: [String]
Run Code Online (Sandbox Code Playgroud)
但putStrLn :: String -> IO ()需要一个String参数,而不是Strings的列表。
同样,read :: Read a => String -> a也期望一个String参数,而不是Strings 参数的列表。
另请参阅:使用do符号的类型指南,生动的颜色。