2012-01-30 4 views
6

Я работаю над вопросом 67A of 99 Haskell Questions. Вопрос построения дерева из заданной строки: "x(y,a(,b))" => Branch 'x' (Branch 'y' Empty Empty) (Branch 'a' Empty (Branch 'b' Empty Empty))
Одно из решений с использованием Parsec, как показано ниже:не удается найти модули Parsec в 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) 

Однако мой GHCi не мог ни найти, ни Text.Parsec.StringText.Parsec. Являются ли эти модули устаревшими? Моя GHCi версия 6.12.3

ответ

8

Text.Parsec и Text.Parsec.String являются модулями в пакете parsec версии 3 на. Старый интерфейс parsec-2 доступен из модулей совместимости с традиционными именами Text.ParserCombinators.Parsec.*, но нет модуля *.String, который является новым в parsec-3. Если у вас есть parsec-2 или нет parsec у всех установленных, я рекомендую установить parsec-3 с каноническим cabal install parsec.

Edit:

Если вы хотите, чтобы разобрать менее жесткий синтаксис для деревьев, поддерживая ваш пример ввода,

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

по умолчанию два пустых детей, если письмо не последовало открывающей скобкой ,

+0

thx, он скомпилирован после установки парсека-3. Тем не менее, существует «неожиданное», «ожидающее» («исключение при его запуске сейчас». – manuzhang

+0

Вход «x (y, a (, b))» не может быть проанализирован данным синтаксическим анализатором, что требует жесткого формата " x (y (,), a (, b (,))) для этого дерева. –

+0

thx снова, и я отправляю ваше решение по 99 вопросам Haskell. Это нормально? Если нет, я немедленно удалю его – manuzhang

0

Parsec находится под Text.ParserCombinators.Parsec вместо Text.Parsec.

Смежные вопросы