我写了一个函数,它符合,但我不确定它是否按照我打算的方式工作或如何在终端中调用它。基本上,我想要一个字符串,如(“年龄”,5),(“年龄”,6),并使其成为元组列表[(“age1”,5)......]。我正在尝试编写一个单独使用逗号的函数,或者我只是不确定如何在终端中调用它或者我做错了。
items :: Parser (String,Integer) -> Parser [(String,Integer)]
items p = do { p <- sepBy strToTup (char ",");
return p }
答案 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)]