我一直在研究99个Haskell问题的问题67A.问题是从给定的字符串构造树:"x(y,a(,b))" => Branch 'x' (Branch 'y' Empty Empty) (Branch 'a' Empty (Branch 'b' Empty Empty))
使用的一个解决方案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)
Run Code Online (Sandbox Code Playgroud)
但是,我的GHCi既不能找到Text.Parsec.String也不能找到Text.Parsec.这些模块是否已过时?我的GHCi版本是6.12.3
Text.Parsec并且Text.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)
Run Code Online (Sandbox Code Playgroud)
如果字母后面没有左括号,则默认为两个空子项.