给定表示复数的数据类型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
答案 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
时,您可能希望使用satisfy
,isDigit
,read
和可能some
的某种组合(取决于您如何解决)这一点)。
完成CI
后,使parseCI
读取实例更加简单明了:
instance Read CI where
readsPrec _ = runParser parseCI