
David Roundy wrote (on 21-09-02 07:30 -0400):
Here is what I'd like to do:
\begin{code} data D = A String | B String instance Show D where show = showD instance Read D where readsPrec _ = readsD readD s = (readsA s) ++ (readsB s) \end{code}
A is formatted like ``A string''. \begin{code} showD (A s) = "A " ++ s readsA s = [(A thestr, r) | ("A", x) <- mylex s, (thestr, r) <- mylex x] \end{code} .. [ and similarly for B ] ...
The problem I have is that ghc complains because I've split up the definition of showD with readsA defined in between. This surprised me, since it seemed that the code should still be unambiguous.
Is there some nice way around this,
There's no way to intersperse clauses of top-level declarations, no.
or do I have to define a separate function for each constructor, and then have a list in one place (as I do with the readsD, in that case because pattern matching won't give me what I want), like:
showD (A s) = showA (A s) showD (B s) = showB (B s)
Almost. But then showA and showB are partial. It's better to do this: showA s = "A " ++ s and similarly for B, and then: data D = A String | B String instance Show D where show (A s) = showA s show (B s) = showB s instance Read D where readsPrec _ = readsD readD s = (readsA s) ++ (readsB s) What you are doing here basically is just assigning names to the branches of a case-expression: h sum = case sum of Left x -> ... x ... Right y -> ... y ... <= h sum = case sum of Left x -> (\x' -> ... x' ...) x Right y -> (\y' -> ... y' ...) y <= h sum = let f x' = ... x' ... g y' = ... y' ... in case sum of Left x -> f x Right y -> g y <= f x' = ... x' ... g y' = ... y' ... h (Left x) = f x h (Right y) = g y -- Frank