2012-01-30 14 views
6

Pracowałem nad pytaniem 67A of 99 Haskell Questions. Pytanie jest konstruowanie drzewa z danego łańcucha: "x(y,a(,b))" => Branch 'x' (Branch 'y' Empty Empty) (Branch 'a' Empty (Branch 'b' Empty Empty))
Jedno rozwiązanie używając Parsec jest jak poniżej:nie można znaleźć modułów Parsec w GHCi

import Text.Parsec.String 
import Text.Parsec hiding (Empty) 

pTree :: Parser (Tree Char) 
pTree = do 
    pBranch <|> pEmpty 

pBranch = do 
    a <- letter 
    char '(' 
    t0 <- pTree 
    char ',' 
    t1 <- pTree 
    char ')' 
    return $ Branch a t0 t1 

pEmpty = 
    return Empty 

stringToTree str = 
    case parse pTree "" str of 
    Right t -> t 
    Left e -> error (show e) 

Jednak moja GHCi mógł ani znaleźć Text.Parsec.String ani Text.Parsec. Czy te moduły są przestarzałe? Moja wersja GHCi jest 6.12.3

Odpowiedz

8

Text.Parsec i Text.Parsec.String są modułami w pakiecie parsec od wersji 3 na. Stary interfejs parsec-2 jest dostępny z modułów zgodności o tradycyjnej nazwie Text.ParserCombinators.Parsec.*, ale nie ma modułu *.String, który jest nowy w parsec-3. Jeśli masz zainstalowaną parsec-2 lub nie parsec, zalecamy zainstalowanie parsec-3 z kanonicznym cabal install parsec.

Edit:

Jeśli chcesz analizować mniej sztywny składni drzew, wspierając swoją przykładową wejście,

pBranch = do 
    a <- letter 
    do char '(' 
    t0 <- pTree 
    char ',' 
    t1 <- pTree 
    char ')' 
    return $ Branch a t0 t1 
    <|> return (Branch a Empty Empty) 

domyślnie dwóch pustych dzieci, jeżeli pismo nie następuje nawias otwierający .

+0

thx, jest skompilowany poprawnie po zainstalowaniu parsetu-3. Istnieje jednak "nieoczekiwany", "oczekujący" ("wyjątek podczas uruchamiania go teraz." – manuzhang

+0

Wejście "x (y, a (, b))" nie może zostać przetworzone przez dany parser, który wymaga sztywnego formatu " x (y (,), a (, b (,))) "dla tego drzewa –

+0

thx ponownie i mogę wysłać twoje rozwiązanie na 99 pytań Haskella .Jest to OK? Jeśli nie, natychmiast go usunęę – manuzhang

0

Parsec znajduje się pod Text.ParserCombinators.Parsec zamiast Text.Parsec.

Powiązane problemy