首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用回旋镖解析整数列表

使用回旋镖解析整数列表
EN

Stack Overflow用户
提问于 2013-08-25 00:23:30
回答 2查看 186关注 0票数 2

我试图解析表单的URL

代码语言:javascript
复制
/123/456/789

使用以下代码:

代码语言:javascript
复制
{-# LANGUAGE OverloadedStrings, TemplateHaskell, TypeOperators #-}

import Prelude hiding ((.), id)
import Control.Category ((.), id)
import Text.Boomerang.TH (derivePrinterParsers)
import Web.Routes.Boomerang

data Indices = Indices [Integer]
$(derivePrinterParsers ''Indices)

sitemap :: Router () (Sitemap :- ())
sitemap = rIndices . rList (integer . eos)

不幸的是,试图使用

代码语言:javascript
复制
> parse sitemap ["0", "1"]

导致无限循环。

有什么简单的方法来解析斜杠分隔的整数列表吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-25 11:37:55

Text.Boomerang.Texts的某个地方似乎有一个bug。

代码语言:javascript
复制
{-# LANGUAGE OverloadedStrings #-}

import Prelude hiding ((.))
import Control.Category ((.))

import Text.Boomerang
import Text.Boomerang.Strings as S
import Text.Boomerang.Texts as T

test1 = parseStrings (rList (S.integer . S.eos)) ["0", "1"]
test2 = parseTexts   (rList (T.integer . T.eos)) ["0", "1"]

test1会返回预期的结果,但是test2会永远循环,尽管它们在语义上应该是等价的。

代码语言:javascript
复制
*Main> test1
Right [0,1]
*Main> test2
^CInterrupted.

这对于包含Text.Boomerang.Texts模块: 1.3.2和1.3.3的两个版本的回巢器来说都是可重复的。

回到解析URL。如果你不介意完全摆脱回旋镖包,你可以这样做:

代码语言:javascript
复制
import Data.Text (Text)                                                                                                                                                                       
import qualified Data.Text as T
import qualified Data.Text.Read as T

parseURL :: Text -> Either String [Int]
parseURL = fmap (map fst) . mapM T.decimal . T.splitOn "/"

下面是一个测试用例:

代码语言:javascript
复制
*Main> parseURL "123/456/789"
Right [123,456,789]
*Main> parseURL "123/456/789/"
Left "input does not start with a digit"
票数 3
EN

Stack Overflow用户

发布于 2013-09-06 15:20:29

很抱歉耽搁了你!我当时在沙漠里的那个东西上。这确实是个错误。我已经上传了包含这一变化的回旋镖-1.3.4:

代码语言:javascript
复制
hunk ./Text/Boomerang/Texts.hs 193
-digits = rText digit
+digits = rText1 digit

有了这个修复,Text版本的行为就像String版本。谢谢你的报告!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18424469

复制
相关文章

相似问题

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