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
相关产品推荐
相关产品推荐

