2011-12-31 10 views
19

posso effettuare le seguenti operazioni:In quali scenari Haskell "legge" restituisce più di una voce di elenco?

Prelude> reads "1 2 3" :: [(Int, String)] 
[(1," 2 3")] 
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)] 
[((1,2)," (3,4)")] 
Prelude> reads "(1,2)(3,4)" :: [((Int, Int), String)] 
[((1,2),"(3,4)")] 
Prelude> reads "(1,2)\n(3,4)" :: [((Int, Int), String)] 
[((1,2),"\n(3,4)")] 
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)] 
[((1,2)," (3,4)")] 

posso ricavare Read e ottenere letture di leggere anche quelle. Ma non ho mai letto per restituire più di una tupla nella lista. Perché reads restituisce un elenco?

risposta

16

Nessuna delle istanze standard lo fa, ma è destinato ad analisi ambigue; poiché questo non è davvero molto utile, ed i parser che usano questa funzionalità sarebbero molto inefficienti, il valore di ritorno di reads è per tutti gli scopi pratici un Maybe masquerading come [].

Il Report's definition of read rivela il significato previsto di molteplici analizza:

read :: (Read a) => String -> a 
read s = case [x | (x,t) <- reads s, ("","") <- lex t] of 
       [x] -> x 
       [] -> error "PreludeText.read: no parse" 
       _ -> error "PreludeText.read: ambiguous parse" 

Quindi: ragioni storiche, in fondo.

+0

Grazie per il chiarimento. Dovevo sapere se mi mancava qualcosa. – Ana

3

È possibile definire istanze Read per i tipi di dati che potrebbero restituire più di un articolo in reads. Non mi sono imbattuto in una situazione in cui avrebbe senso, ma è possibile.

Problemi correlati