2012-01-30 69 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是如下:在GHCi中找不到Parsec模塊

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.String也不Text.Parsec。這些模塊是否過時了? 我GHCI版本6.12.3是

回答

8

Text.ParsecText.Parsec.String是來自版本3的parsec包中的模塊。舊版parsec-2接口可從兼容性模塊獲得,傳統名稱Text.ParserCombinators.Parsec.*,但沒有*.String模塊,這是parsec-3中的新模塊。如果您安裝了parsec-2或者沒有parsec,我建議安裝parsec-3與規範cabal install parsec

編輯:如果字母后面沒有開括號

如果要解析的樹木較小剛性的語法,支持你的榜樣輸入,

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

默認爲兩名空兒。

+0

thx,安裝parsec-3後編譯好。但是,現在運行它時會出現一個'意外的','期待的'(「'異常' – manuzhang 2012-01-30 04:58:14

+0

)輸入」x(y,a(,b))「不能由給定的解析器解析, x(y(,),a(,b(,)))「 – 2012-01-30 05:55:41

+0

thx再次,我在Haskell的99個問題上發佈你的解決方案,那好嗎?如果不是,我會立即刪除它 – manuzhang 2012-01-30 08:49:17

0

ParsecText.ParserCombinators.Parsec而不是Text.Parsec下找到。