Мне кажется, что вы запутались в разнице между получением строки как String
и чтением / анализом строки ввода как пользовательского типа.Вы используете getLine
, который всегда возвращает именно String
, который вводит пользователь.Сравните:
Prelude> fmap length getLine
["12","13"]
11
Prelude> length "[\"12\",\"13\"]" -- explanation of the 11
11
Prelude> fmap length (readLn :: IO [String])
["12","13"]
2
Prelude> length ["12", "13"] -- explanation of the 2
2
Как показано здесь, вы, вероятно, захотите использовать readLn
, который сначала получает строку ввода, а затем анализирует ее с помощью read
.
-- defined in the Prelude
readLn = do
s <- getLine
return (read s)
ЕслиЯ изменяю ваш код так, чтобы он включал импорт и определения ниже:
import Control.Monad
type Line = [String]
... и вызывал readLn
вместо getLine
, тогда я могу набирать буквальные строки ["12","13"]
и ["121","13"]
без ошибок.