Этот код не компилируется в 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