[英]Parsec sepBy Haskell
我寫了一個函數並且它符合要求,但是我不確定它是否按我預期的方式工作或如何在終端中調用它。 本質上,我想使用一個字符串,例如(“ age”,5),(“ age”,6)並使其成為元組列表[[“ age1”,5)...]。 我試圖編寫一個用逗號分隔的函數,或者我只是不確定如何在終端中調用它,或者我做錯了。
items :: Parser (String,Integer) -> Parser [(String,Integer)]
items p = do { p <- sepBy strToTup (char ",");
return 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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.