Почему `putStrLn getLine` не работает? - PullRequest
7 голосов
/ 07 марта 2011

Я полный новичок на Хаскеле. Мой скрипт на Haskell с GHCi,

Prelude> let a = putStrLn getLine

делает ошибку, подобную этой.

<interactive>:1:17:
    Couldn't match expected type `String'
           against inferred type `IO String'
    In the first argument of `putStrLn', namely `getLine'
    In the expression: putStrLn getLine
    In the definition of `a': a = putStrLn getLine
Prelude> 

Почему не работает и как я могу напечатать что-нибудь из stdin?

1 Ответ

14 голосов
/ 07 марта 2011
putStrLn :: String -> IO ()
getLine :: IO String

Типы не совпадают.getLine - это действие IO, а putStrLn принимает простую строку.

Вам нужно связать строку внутри монады IO, чтобы передать ее в putStrLn.Следующее эквивалентно:

a = do line <- getLine
       putStrLn line

a = getLine >>= \line -> putStrLn line

a = getLine >>= putStrLn
...