簡體   English   中英

帕爾塞克(Haskell)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM