2011-12-31 12 views
19

mogę wykonać następujące czynności:W jakich sytuacjach "czyta" Haskella zwraca więcej niż jeden element listy?

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)")] 

mogę czerpać Read i odczytuje się czytać tych zbyt. Ale nigdy nie dostałem lektury, aby zwrócić więcej niż jedną krotkę na liście. Dlaczego reads zwraca listę?

Odpowiedz

16

Żadna ze standardowych instancji nie robi tego, ale jest przeznaczona do niejednoznacznych analiz; ponieważ nie jest to zbyt użyteczne, a parsery, które używają tej funkcji, byłyby bardzo nieefektywne, wartość zwracana jest ze względów praktycznych pod maską Maybe pod maską jako pod nazwą .

Report's definition of read ujawnia zamierzony sens wielu parsowań:

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" 

Więc: historyczne powody, w zasadzie.

+0

Dzięki za wyjaśnienia. Potrzebowałem wiedzieć, czy czegoś brakuje. – Ana

3

Można zdefiniować instancje Read dla typów danych, które mogą zwrócić więcej niż jeden element w reads. Nie natknąłem się na sytuację, w której miałoby to sens, ale jest to możliwe.

Powiązane problemy