Этот код не компилируется в GHC 7.0.3:
import System.IO
main = do
z <- readLn
print z
Мое намерение состоит в том, чтобы прочитать одну строку из stdin и сохранить ее в 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 () }
Очевидно, есть что-то фундаментальное, которое я еще не понял; пожалуйста, объясните мне, почему это не работает и как это исправить.
EDIT1: я исправил ошибку компиляции, изменив print z
на putStrLn z
, поэтому GHC понимает, что я хочу прочитать строку. Но когда я запускаю программу, я получаю ошибку времени выполнения, которую я не могу понять:
$ ./test
hello!
test: user error (Prelude.readIO: no parse)
$
Я просто набрал "привет!". и затем введите. Обратите внимание, что я запускаю x86_64 GHC на OS X, который считается неустойчивым.
EDIT2: я изменил readLn на getLine, и он волшебным образом работает без причины. Я хотел бы знать, почему, но я рад, что он работает.
Конечный код:
import System.IO
main = do
z <- getLine
print z