gpt4 book ai didi

haskell - 使用 boomerang 解析整数列表

转载 作者:行者123 更新时间:2023-12-02 04:53:20 26 4
gpt4 key购买 nike

我正在尝试解析表单的 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"]

导致无限循环。

是否有任何简单的方法来解析以斜杠分隔的整数列表?

最佳答案

看来 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 模块的两个版本的 boomerang 重现:1.3.2 和 1.3.3。

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

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"

关于haskell - 使用 boomerang 解析整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com