Parsec sepBy Haskell

时间:2018-04-03 14:40:11

标签: parsing haskell parsec

我写了一个函数,它符合,但我不确定它是否按照我打算的方式工作或如何在终端中调用它。基本上,我想要一个字符串,如(“年龄”,5),(“年龄”,6),并使其成为元组列表[(“age1”,5)......]。我正在尝试编写一个单独使用逗号的函数,或者我只是不确定如何在终端中调用它或者我做错了。

items :: Parser (String,Integer) -> Parser [(String,Integer)]
items p =  do { p <- sepBy strToTup (char ",");
                return p }

1 个答案:

答案 0 :(得分:0)

我不确定你想要什么,我不知道Parser是什么。

从这样的字符串开始:

thestring = "(\"age\",5),(\"age\",6),(\"age\",7)"

我首先使用正则表达式方法删除外部逗号:

import Text.Regex
rgx = mkRegex "\\),\\("
thestring' = subRegex rgx thestring ")("

这给出了:

>>> thestring'
"(\"age\",5)(\"age\",6)(\"age\",7)"

然后我会分手:

import Data.List.Split
thelist = split (startsWith "(") thestring'

给出:

>>> thelist
["(\"age\",5)","(\"age\",6)","(\"age\",7)"]

如果我正确理解,这就是你想要的。

这可能不是最好的方式。由于最终列表中的所有元素都具有("age", X)格式,因此您可以提取所有数字(我不知道但这应该不难),然后很容易获得最终列表。可能更好。

如果这与你的问题无关,请道歉。

修改

JFF(&#34;只是为了好玩&#34;),另一种方式:

import Data.Char (isDigit)
import Data.List.Split
thestring = "(\"age\",15),(\"age\",6),(\"age\",7)"
ages = (split . dropBlanks . dropDelims . whenElt) (not . isDigit) thestring
map (\age -> "(age," ++ age ++ ")") ages
-- result: ["(age,15)","(age,6)","(age,7)"]

或者更确切地说:

>>> map (\age -> ("age",age)) ages
[("age","15"),("age","6"),("age","7")]

或者如果你想要整数:

>>> map (\age -> ("age", read age :: Int)) ages
[("age",15),("age",6),("age",7)]

或者如果你想要age1,age2,......:

import Data.List.Index
imap (\i age -> ("age" ++ show (i+1), read age :: Int)) ages
-- result: [("age1",15),("age2",6),("age3",7)]