Чтение из stdin в Haskell с использованием IO.readLn

Этот код не компилируется в GHC 7.0.3:

import System.IO

main = do
    z <- readLn
    print z

Я намерен прочитать одну строку из стандартного ввода и сохранить ее в z, чтобы сделать более сложные прочее с этим позже. Сообщение об ошибке выглядит так:

test.hs:5:9:
    Ambiguous type variable `a0' in the constraints:
      (Show a0) arising from a use of `print' at test.hs:5:9-13
      (Read a0) arising from a use of `readLn' at test.hs:4:14-19
    Probable fix: add a type signature that fixes these type variable(s)
    In a stmt of a 'do' expression: print z
    In the expression:
      do { z <- readLn;
           print z;
           return () }
    In an equation for `main':
        main
          = do { z <- readLn;
                 print z;
                 return () }

Очевидно, есть кое-что фундаментальное, чего я еще не понял; пожалуйста, объясните мне, почему это не работает и как это исправить.

РЕДАКТИРОВАТЬ1 : я исправил ошибку компиляции, изменив print z на putStrLn z , чтобы GHC понимал, что я хочу прочитать строку. Но когда я запускаю программу, я получаю ошибку выполнения, которую не могу понять:

$ ./test
hello!
test: user error (Prelude.readIO: no parse)
$

Я просто набрал «привет!» а затем введите. Обратите внимание, что я использую x86_64 GHC в OS X, что считается нестабильным.

РЕДАКТИРОВАТЬ2 : Я изменил readLn на getLine, и он волшебным образом работает без всякой причины. Я хотел бы знать почему, но я рад, что это работает.

Окончательный код:

import System.IO

main = do
    z <- getLine
    print z
15
задан Betamos 18 October 2011 в 13:50
поделиться