我一直在研究问题67A of 99 Haskell Questions。问题是从给定的字符串构建树:"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)
但是,我的GHCi既无法找到Text.Parsec.String
也找不到Text.Parsec
。这些模块是否已过时? 我的GHCi版本是6.12.3
答案 0 :(得分:8)
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)
如果字母后面没有左括号,则默认为两个空子项。
答案 1 :(得分:0)
Parsec
位于Text.ParserCombinators.Parsec
下,而不是Text.Parsec
。