的Read类型类不直接声明read
;相反,它定义了readsPrec
,它支持优先级(这对于涉及其他类型元素的复杂数据类型的值时非常重要)。你当你使用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
数据类型,但类似的规则适用于其它用户定义的抽象数据类型)。 (另外,上面是一个小小的谎言:GHC实际上使用了不同的实现方式,但是除非您愿意在GHC内部进行挖掘,否则上述是您应该做的一件事。)
read
以术语定义readsPrec
和readList
(Read
中的另一种方法,除Char
之外的每种类型都默认为[Char]
,其中[Char]
用作字符串而不是Char
的列表)。
如果标准推导不充分,对于类似于您的类型,它只是一个Int
s桶,您可以忽略优先级参数。
BTW,Read
和Show
相当慢;您可能需要考虑其他方式来处理数据的I/O。
你有任何关于阅读和展示替代品的建议吗? – user381261 2011-04-02 23:08:43