从头开始解析复数

时间:2016-11-14 03:46:46

标签: parsing haskell

给定表示复数的数据类型data CI = CI Int Int,我想为CI构建一个解析器,可以将"a"转换为CI a 0"(a,b)"转换为{{1 }}。例如,我想要一个函数CI a b这样parseCI返回值runParser parseCI "(1,2)"(理想情况下,类似的东西很好)。我还想让CI成为[(CI 1 2, "")]的一个实例。

我想使用下面代码中的函数和定义来执行此操作(基本上,没有任何高级操作,如Parsec),但我不知道从哪里开始。一些启动代码将我置于正确的轨道和/或提示将是有帮助的。我并不是在寻找一个完整的答案,因为我想自己解决这个问题。

read

1 个答案:

答案 0 :(得分:2)

您可能已经看过了,但万一您没有:Monadic Parsing in Haskell设置解析方式。

由于您有两种不同的方式来解析CI,您可能希望将其作为两个问题来处理:制作一个解析器parseCI1,将"a"解析为CI a 0并制作另一个解析器parseCI2解析"(a,b)"CI a b。然后,您可以将这些与

组合成一个
parseCI = parseCI1 <|> parseCI2

对于这两个子分析符,您需要一些解析整数的方法:parseInt :: Parser Int。在制作parseInt时,您可能希望使用satisfyisDigitread和可能some的某种组合(取决于您如何解决)这一点)。

完成CI后,使parseCI读取实例更加简单明了:

instance Read CI where
  readsPrec _ = runParser parseCI