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

Haskell中如何正确获取命名字段?(Parsec解析器场景)

解决Parsec解析器中提取Param类型命名字段的问题

你遇到的核心问题是paramExpr1返回的是Param类型的值,但你直接把它传给Param构造函数——而构造函数第一个参数需要的是String类型(对应paramName字段),所以类型不匹配。

在Haskell中,定义带命名字段的数据类型时,每个字段名会自动生成一个访问器函数:比如paramName就是一个Param -> String的函数,用它就能直接从Param值里提取对应的字段内容。

修改后的paramExpr3可以这样写:

paramExpr3 :: Parser Param
paramExpr3 = do
  parsedParam <- paramExpr1
  let extractedName = paramName parsedParam -- 提取paramName字段值
  return $ Param extractedName Nothing

如果想更简洁,也可以用fmap简化代码:

paramExpr3 :: Parser Param
paramExpr3 = fmap (\p -> Param (paramName p) Nothing) paramExpr1

补充说明:如果你的paramExpr3只是想复用paramExpr1的解析结果且保持argument为Nothing,那它和paramExpr1功能完全一致,可能不需要单独定义。但如果后续要修改argument字段,上面提取paramName的方法依然适用。

内容的提问来源于stack exchange,提问作者student422

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:15:46