如何正确地获取haskell中的命名字段?

tyg4sfes  于 2023-01-17  发布在  其他
关注(0)|答案(2)|浏览(152)

我正在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,但我不明白如何获取

o8x7eapl

o8x7eapl1#

您可以使用字段名称作为函数来提取字段:

paramExpr3 :: Parser Param
paramExpr3 = do
  pN <- paramExpr1
  return $ Param (paramName pN) Nothing

或者,您可以使用记录更新语法并更改要更改的字段,同时保留其他字段不变,而不是使用构造函数Param创建新值。

paramExpr3 :: Parser Param
paramExpr3 = do
  pN <- paramExpr1
  return pN{ argument = Nothing }

存在更多的替代方法(例如使用透镜),但这些是最基本的方法。

zaqlnxep

zaqlnxep2#

Parser是一个函子,因此可以将函数Map到解析器上,以便将该函数应用于解析器将生成的任何内容。

paramExpr3 :: Parser Param
paramExpr3 = do
    pName <- fmap parserName parseExpr1 -- turn a Parser Param into a Parser String
    return $ Param pName Nothing

如果您有一个Param -> Param类型的函数,它将现有的argument字段替换为Nothing

toNothing :: Param -> Param
toNothing (Param n _) = Param n Nothing

你可以直接Map到解析器上。

parseExpr3 :: Parser Param
parseExpr3 = fmap toNothing parseExpr1

相关问题