2011-10-21 15 views
13

Così ho un tipo di datiCome creare un'istanza di lettura per un tipo di dati in Haskell

data SomeType a = 
    Type a | 
    Mix (SomeType a) (SomeType a) 

Questo mio spettacolo istanza per SomeType

instance (Show a) => Show (SomeType a) where 
    show (Type a) = show a 
    show (Mix a b) = "(" ++ show a ++ " " ++ show b ++ ")" 

Così

Mix (Type 5) (Type 4) 

darebbe me

(5 4) 

Ora voglio avere

read "(3 4)" :: SomeType Int 

producono

(3 4) 

o

read "(a b)" :: SomeType Char 

produrre

(a b) 

sono perso a come utilizzare la classe di leggere.

+0

btw, il tuo esempio per 'SomeType char' non è quello che' show (Mix (tipo 'A') (tipo 'b')) ' avrebbe generato. – hvr

+2

È possibile derivare sia - l'istanza Mostra e Leggi - con un 'derivando (Mostra, Leggi)' dopo il tipo di delcaricazione. Sebbene non generino il tuo output e input, sono un modo standard per mostrare (e talvolta leggere) i valori, ed è per questo che dovresti usarli al posto delle tue istanze. Se vuoi mostrarli in un modo diverso, usa una funzione separata e chiamala 'render' o così. – bzn

risposta

13

Ecco un esempio basato sul documentation che dovrebbe essere in grado di analizzare tutto ciò che show rende (assumendo che il tipo ha una compatibile Read esempio definito), cioè read . show dovrebbe essere più o meno l'identità:

instance (Read a) => Read (SomeType a) where 
    readsPrec d r = readMix r ++ readType r 
     where 
     readMix = readParen True $ \r -> do 
      (v1, r'') <- readsPrec d r 
      (v2, r') <- readsPrec d r'' 
      return (Mix v1 v2, r') 

     readType r = do 
      (v, r') <- readsPrec d r 
      return (Type v, r') 

Così,

> read "(3 4)" :: SomeType Int 
(3 4) 
it :: SomeType Int 

Ma nota, che per SomeType Char l'istanza predefinita Show di Char Surround s il personaggio con apici:

> read "('a' ('b' 'c'))" :: SomeType Char 
('a' ('b' 'c')) 
it :: SomeType Char 

Spero che questo aiuti

+1

Che cosa è 'd' e' r' in 'readsPrec dr' – nobody

+1

@Qin' d' è la precedenza dell'operatore (che ho accidentalmente incrementato - ho modificato questo) del contesto di analisi che racchiude e 'r' è l'attuale stringa rimanente da analizzare. – hvr

Problemi correlati