Parsing 如何使用attoparsec解析固定长度的非分隔整数?

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

我正在尝试使用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 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,但第一个字符只是后面数据类型的标志。