在GHCi中找不到Parsec模块

时间:2012-01-30 03:11:32

标签: haskell

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

2 个答案:

答案 0 :(得分: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)

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

答案 1 :(得分:0)

Parsec位于Text.ParserCombinators.Parsec下,而不是Text.Parsec