Parsing 如何使用attoparsec解析固定长度的非分隔整数?
我正在尝试使用attoparsec解析3个字符中的两个整数。示例输入可能如下所示:Parsing 如何使用attoparsec解析固定长度的非分隔整数?,parsing,haskell,integer,attoparsec,Parsing,Haskell,Integer,Attoparsec,我正在尝试使用attoparsec解析3个字符中的两个整数。示例输入可能如下所示: 341 。。。我想将其解析为: Constructor 34 1 我有两种解决方案,但有些笨重: stdK :: P.Parser Packet stdK = do P.char '1' qstr <- P.take 2 let q = rExt $ P.parseOnly P.decimal qstr n <- P.decimal return $ Std
341
。。。我想将其解析为:
Constructor 34 1
我有两种解决方案,但有些笨重:
stdK :: P.Parser Packet
stdK = do
P.char '1'
qstr <- P.take 2
let q = rExt $ P.parseOnly P.decimal qstr
n <- P.decimal
return $ Std q n
stdK2 :: P.Parser Packet
stdK2 = do
P.char '1'
qn <- P.decimal
let q = div qn 10
let n = rem qn 10
return $ Std q n
stdK::P.解析器包
stdK=do
P.char“1”
qstr您的代码片段远不是自包含的(特别是缺少导入和数据包
数据类型的定义),但您似乎过于复杂了
首先,定义一位整数的解析器。然后,将后者用作两位数整数解析器的构造块。然后,使用应用运算符组合这两个解析器,并为自定义的数据包
数据类型定义一个解析器。见下文
请注意,您不需要单子的全部功能;在这里,应用程序解析就足够了
——测试
{-#语言重载字符串}
导入控件。应用程序(())
导入Data.c.Text
导入数据.Char
数据包=Std{-#解包#-}!Int
{-#打开包装{-}!Int
派生(显示)
stdK::解析器数据包
stdK=char'1'*>(标准twoDigitInt-oneDigitInt)
twoDigitInt::解析器Int
twoDigitInt=timesTenPlus一个Digitint一个Digitint
哪里
timesTenPlus x y=10*x+y
oneDigitInt::解析器Int
一位数字=一位数字
GHCi中的测试:
λ> :l test_attoparsec.hs
[1 of 1] Compiling Main ( test_attoparsec.hs, interpreted )
Ok, modules loaded: Main.
λ> :set -XOverloadedStrings
λ> parseOnly stdK "1341"
Right (Std 34 1)
λ> parseOnly stdK "212"
Left "1: Failed reading: satisfyWith"
为什么在两个解析器的开头都有一个硬编码的char'1'
?这不会解析您输入的示例“341”
。抱歉,我没有解释。实际输入看起来像1341,但第一个字符只是后面数据类型的标志。