我不知道在哪里vlist
从何而来。它可能应该是解析器用户状态的一部分。现在,让我们假定它是一个顶级的定义:
vlist :: [(String, Float)]
vlist = undefined -- fill in the blanks...
我假设你正在使用Parsec
。您可以将分析器简化为:
primary :: Parser Float
primary = choice [ between (symbol "(") (symbol ")") expression
, do { ident <- identifier
; case lookup ident vlist of
Nothing -> fail $ "No such identifier: " ++ ident
Just v -> return v
}
]
对于如何处理错误有几种选择。在这里,我使用了解析器monad的fail
函数。这将导致解析器返回Left parserError
。或者,您可以将error
替换为fail
,这将导致只能在IO
monad中处理的错误。
注意:要添加vlist
作为解析器的状态,你需要定义与该国一个新的解析器类型:
data MyParserState = MyParserState { vlist :: [(String, Float)] }
type MyParser = CharParser MyParserState
-- these parsers now need to return MyParser type!
symbol :: String -> MyParser String
identifier :: MyParser String
expression :: MyParser Float
primary :: MyParser Float
primary = choice [ between (symbol "(") (symbol ")") expression
, do { st <- getState
; ident <- identifier
; case lookup ident $ vlist st of
Nothing -> fail $ "No such identifier: " ++ ident
Just v -> return v
}
]
来源
2012-03-27 03:53:05
pat
你正在寻找一个以前的答案:http://stackoverflow.com/questions/3375483/operating-on-a-return-from-a-maybe-that-contains-just – 2012-03-27 03:44:47