Haskell IO: печать аргументов командной строки - PullRequest
0 голосов
/ 18 января 2020

У меня есть эта программа, которая просто печатает аргументы командной строки.

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'

Ответы [ 2 ]

7 голосов
/ 18 января 2020

Поскольку

getArgs :: IO [String]

, поэтому line в do { line <- getArgs ; ... } равно

line    ::    [String]

, но putStrLn :: String -> IO () ожидает аргумент String, не a список String с.

Аналогично, read :: Read a => String -> a также ожидает аргумент String, не список аргумента String s.

См. также : Руководство по типам в do -обозначении, в ярких цветах .

1 голос
/ 18 января 2020

print производит a String из любого аргумента, который вы ему даете.

putStrLn, с другой стороны, ожидает a String в качестве аргумента. (Действительно, print = putStrLn . show.) Точно так же read ожидает String в качестве аргумента; в действительности он десериализует , когда вы пытаетесь сериализовать список.

getArgs имеет тип IO [String], что означает, что line это не String, но оба String и Show a => [a] имеют экземпляр Show, который print может использовать для создания String из него.

...