使用回旋镖解析整数列表

时间:2013-08-25 00:23:30

标签: haskell routes web-routes-boomerang

我正在尝试解析表单

的网址
/123/456/789

使用以下代码:

{-# 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)

不幸的是,尝试使用

运行此解析器
> parse sitemap ["0", "1"]

导致无限循环。

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

2 个答案:

答案 0 :(得分:3)

似乎Text.Boomerang.Texts中的某个地方存在错误。

{-# 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会永远循环,但它们应该在语义上等效。

*Main> test1
Right [0,1]
*Main> test2
^CInterrupted.

这适用于包含Text.Boomerang.Texts模块的两种版本的回旋镖:1.3.2和1.3.3。

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

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 "/"

这是一个测试用例:

*Main> parseURL "123/456/789"
Right [123,456,789]
*Main> parseURL "123/456/789/"
Left "input does not start with a digit"

答案 1 :(得分:2)

对此延迟感到抱歉!我在沙漠中的那个东西。这确实是一个错误。我上传了包含此更改的boomerang-1.3.4:

hunk ./Text/Boomerang/Texts.hs 193
-digits = rText digit
+digits = rText1 digit

使用该修复程序,Text版本的行为类似于String版本。谢谢你的报告!