我写了一个函数,它符合我的要求,但我不确定它是否按照我想要的方式工作,也不确定如何在终端中调用它。本质上,我希望获取一个字符串,如("age",5),("age",6),并将其转换为一个元组列表(“age1”,5)……我正在试着写一个用逗号分隔的函数,我只是不确定如何在终端中调用它,或者我做错了。
items :: Parser (String,Integer) -> Parser [(String,Integer)]
items p = do { p <- sepBy strToTup (char ",");
return p }发布于 2018-04-04 02:52:00
我不知道你想要什么,我也不知道什么是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)]或者如果你想要age1,age2,...:
import Data.List.Index
imap (\i age -> ("age" ++ show (i+1), read age :: Int)) ages
-- result: [("age1",15),("age2",6),("age3",7)]https://stackoverflow.com/questions/49632868
复制相似问题