Parsing 帕塞克·塞比·哈斯克尔
我编写了一个函数,它符合我的要求,但我不确定它是否按照我的预期工作,或者如何在终端中调用它。本质上,我想获取一个字符串,比如(“age”,5),(“age”,6),并将其放入一个元组列表[(“age1”,5)…]。我正在尝试编写一个分隔逗号的函数,要么我不知道如何在终端中调用它,要么我做错了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
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中包含错误消息。