Parsing 帕塞克·塞比·哈斯克尔

Parsing 帕塞克·塞比·哈斯克尔,parsing,haskell,parsec,Parsing,Haskell,Parsec,我编写了一个函数,它符合我的要求,但我不确定它是否按照我的预期工作,或者如何在终端中调用它。本质上,我想获取一个字符串,比如(“age”,5),(“age”,6),并将其放入一个元组列表[(“age1”,5)…]。我正在尝试编写一个分隔逗号的函数,要么我不知道如何在终端中调用它,要么我做错了 items :: Parser (String,Integer) -> Parser [(String,Integer)] items p = do { p <- sepBy strToTup

我编写了一个函数,它符合我的要求,但我不确定它是否按照我的预期工作,或者如何在终端中调用它。本质上,我想获取一个字符串,比如(“age”,5),(“age”,6),并将其放入一个元组列表[(“age1”,5)…]。我正在尝试编写一个分隔逗号的函数,要么我不知道如何在终端中调用它,要么我做错了

items :: Parser (String,Integer) -> Parser [(String,Integer)]
items p =  do { p <- sepBy strToTup (char ",");
                return p }
items::解析器(字符串,整数)->解析器[(字符串,整数)]

items p=do{p我不确定您想要什么,也不知道什么是
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(“只是为了好玩”),另一种方式:

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)]
或者,如果您想要1岁,2岁,…:

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

使用参数:
items p=sebby p(char',')
我希望它是符号“,”,而不是字符,但当我尝试进行调整时,它不起作用,请在问题a中包含错误消息。