Purescript 如何解析URL查询字符串并转换为指定类型记录
实现步骤
1. 依赖说明
你需要在项目配置中先引入以下必备依赖:
purescript-uripurescript-parsingpurescript-maybepurescript-prelude
2. 完整实现代码
module QueryParser where import Prelude import Data.Int (fromString) import Data.Maybe (Maybe(..), optional) import Text.Parsing.Parser (runParser) import URI.Query (Query(..), QueryParam(..), parseQuery) import Data.Boolean (fromString as booleanFromString) import Effect (Effect) import Effect.Console (log) -- 定义目标解析结果类型 type QueryResult = { s :: String, i :: Int, b :: Maybe Boolean } -- 主解析函数,输入原始查询字符串,返回解析结果或错误信息 parseQueryString :: String -> Either String QueryResult parseQueryString qs = do -- 先将原始字符串解析为结构化的Query对象 Query params <- either (Left <<< show) Right $ parseQuery qs -- 提取必填参数s sVal <- lookupParam "s" params -- 提取必填参数i并转换为Int类型 iStr <- lookupParam "i" params iVal <- maybe (Left "参数i无法转换为Int类型") Right $ fromString iStr -- 提取可选参数b,不存在时返回Nothing bVal <- optional $ do bStr <- lookupParam "b" params maybe (Left "参数b无法转换为Boolean类型") Right $ booleanFromString bStr pure { s: sVal, i: iVal, b: bVal } where -- 辅助工具:从参数列表中按key查找参数值 lookupParam :: String -> Array QueryParam -> Either String String lookupParam key [] = Left $ "缺少必填参数: " <> key lookupParam key (QueryParam k v : rest) = if k == key then Right v else lookupParam key rest
3. 调用测试示例
main :: Effect Unit main = do -- 测试包含所有参数的场景 let testQuery1 = "s=str&i=1&b=true" case parseQueryString testQuery1 of Right res -> log $ show res -- 输出:{ s: "str", i: 1, b: Just true } Left err -> log $ "解析失败: " <> err -- 测试缺少可选参数b的场景 let testQuery2 = "s=str&i=1" case parseQueryString testQuery2 of Right res -> log $ show res -- 输出:{ s: "str", i: 1, b: Nothing } Left err -> log $ "解析失败: " <> err
内容的提问来源于stack exchange,提问作者WHITECOLOR
相关产品推荐
相关产品推荐

