read
обычно противоположно show
, и они оба обычно используют синтаксис Haskell для представления заданных значений. Это означает, что поскольку в синтаксисе Haskell для символов используются одинарные кавычки, show
для символа будет добавлять одинарные кавычки вокруг него, а read
будет ожидать, что одинарные кавычки будут там.
Другими словами, ваша функция ожидает синтаксис, подобный 'A' 42
, и действительно, если вы попытаетесь это сделать, это сработает:
> parse "'A' 42"
Just ('A',42)
Для вашего формата я бы вместо этого использовал сопоставление с шаблоном для первого символа, а затем reads
для остальных, например. как то так:
parse :: String -> Maybe Pos
parse [] = Nothing
parse (c:rest) = do
(r, _) <- listToMaybe $ reads rest
return (c, r)