首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parsec sepBy Haskell

Parsec sepBy Haskell
EN

Stack Overflow用户
提问于 2018-04-03 22:40:11
回答 1查看 582关注 0票数 0

我写了一个函数,它符合我的要求,但我不确定它是否按照我想要的方式工作,也不确定如何在终端中调用它。本质上,我希望获取一个字符串,如("age",5),("age",6),并将其转换为一个元组列表(“age1”,5)……我正在试着写一个用逗号分隔的函数,我只是不确定如何在终端中调用它,或者我做错了。

代码语言:javascript
复制
items :: Parser (String,Integer) -> Parser [(String,Integer)]
items p =  do { p <- sepBy strToTup (char ",");
                return p }
EN

回答 1

Stack Overflow用户

发布于 2018-04-04 02:52:00

我不知道你想要什么,我也不知道什么是Parser

从这样的字符串开始:

代码语言:javascript
复制
thestring = "(\"age\",5),(\"age\",6),(\"age\",7)"

我将首先使用正则表达式方法删除外部逗号:

代码语言:javascript
复制
import Text.Regex
rgx = mkRegex "\\),\\("
thestring' = subRegex rgx thestring ")("

这提供了:

代码语言:javascript
复制
>>> thestring'
"(\"age\",5)(\"age\",6)(\"age\",7)"

然后我就会分开:

代码语言:javascript
复制
import Data.List.Split
thelist = split (startsWith "(") thestring'

这就给出了:

代码语言:javascript
复制
>>> thelist
["(\"age\",5)","(\"age\",6)","(\"age\",7)"]

如果我没弄错的话,这就是你想要的。

这可能不是最好的方法。由于最终列表的所有元素都具有("age", X)形式,您可以提取所有数字(我不知道,但这应该不难),然后就可以很容易地获得最终列表。也许更好。

如果这与你的问题无关,很抱歉。

编辑

JFF (“只是为了好玩”),另一种方式:

代码语言:javascript
复制
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)"]

或者更确切地说:

代码语言:javascript
复制
>>> map (\age -> ("age",age)) ages
[("age","15"),("age","6"),("age","7")]

或者,如果您想要整数:

代码语言:javascript
复制
>>> map (\age -> ("age", read age :: Int)) ages
[("age",15),("age",6),("age",7)]

或者如果你想要age1,age2,...:

代码语言:javascript
复制
import Data.List.Index
imap (\i age -> ("age" ++ show (i+1), read age :: Int)) ages
-- result: [("age1",15),("age2",6),("age3",7)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49632868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档