在GHCi中找不到Parsec模块

man*_*ang 6 haskell

我一直在研究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

Dan*_*her 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)
Run Code Online (Sandbox Code Playgroud)

如果字母后面没有左括号,则默认为两个空子项.