的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