我正在parsec的帮助下编写解析器,遇到了一个问题
data Param = Param {paramName::String, argument :: Maybe String}
deriving (Show)
paramExpr1 :: Parser Param
paramExpr1 = do
paramKeyword
void $ lexeme $ char '-'
paramName <- word
return $ Param paramName Nothing
paramExpr3 :: Parser Param
paramExpr3 = do
pN <- paramExpr1 -- <- PROBLEM HERE
return $ Param pN Nothing
简而言之,我不明白如何获取命名字段,paramExpr1将返回Param,我想获取paramName,但我不明白如何获取
2条答案
按热度按时间o8x7eapl1#
您可以使用字段名称作为函数来提取字段:
或者,您可以使用记录更新语法并更改要更改的字段,同时保留其他字段不变,而不是使用构造函数
Param
创建新值。存在更多的替代方法(例如使用透镜),但这些是最基本的方法。
zaqlnxep2#
Parser
是一个函子,因此可以将函数Map到解析器上,以便将该函数应用于解析器将生成的任何内容。如果您有一个
Param -> Param
类型的函数,它将现有的argument
字段替换为Nothing
你可以直接Map到解析器上。