2

フォームの URL を解析しようとしています

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

無限ループを引き起こします。

スラッシュで区切られた整数のリストを解析する簡単な方法はありますか?

4

2 に答える 2

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を含むブーメランの両方のバージョンで再現可能です。

URL の解析に戻ります。ブーメラン パッケージを完全に削除しても構わない場合は、次のようにします。

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"
于 2013-08-25T11:37:55.553 に答える
2

遅れてしまい申し訳ありません!私は砂漠のあの場所にいました。これは確かにバグです。この変更を含む boomerang-1.3.4 をアップロードしました。

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

その修正により、Textバージョンはバージョンのように動作しStringます。ご報告ありがとうございます!

于 2013-09-06T15:20:29.177 に答える