You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Purescript 如何解析URL查询字符串并转换为指定类型记录

实现步骤

1. 依赖说明

你需要在项目配置中先引入以下必备依赖:

  • purescript-uri
  • purescript-parsing
  • purescript-maybe
  • purescript-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 15:24:02