Ответ 1
Read typeclass не объявляет read
напрямую; вместо этого он определяет readsPrec
, который поддерживает приоритет (это важно, когда read
значение целого типа данных с элементами других типов). Определение, которое вы получаете при использовании deriving (Read)
, выглядит примерно так:
instance (Read a) => Read (Tree a) where
readsPrec d r = readParen (d > app_prec)
(\r -> [(Leaf m,t) |
("Leaf",s) <- lex r,
(m,t) <- readsPrec (app_prec+1) s]) r
++ readParen (d > up_prec)
(\r -> [(u:^:v,w) |
(u,s) <- readsPrec (up_prec+1) r,
(":^:",t) <- lex s,
(v,w) <- readsPrec (up_prec+1) t]) r
where app_prec = 10
up_prec = 5
(это, очевидно, для типа данных Tree
, но аналогичные правила применяются к другим пользовательским ADT). (Кроме того, вышесказанное представляет собой небольшую ложь: GHC фактически использует другую реализацию, но выше это то, что вам нужно делать, если вы не захотите копаться внутри GHC.)
read
определяется в терминах readsPrec
и readList
(другой метод в read
, который по умолчанию используется для каждого типа, кроме Char
, где он использовал для чтения [Char]
как строку вместо как список Char
).
Если стандартного вывода недостаточно, для типа типа yours, который является просто ведром Int
, вы можете игнорировать параметр приоритета.
BTW, read
и Show
довольно медленные; вы можете рассмотреть другие способы ввода/вывода с вашими данными.