所以我有这个计算器,我正在构建接受用户变量输入,如“let a = 2”这些变量存储在元组列表中(变量,值)我需要帮助从这个列表中获取数据。我的代码到目前为止
primary :: Parser Float
primary = do symbol "("
e <- expression
symbol ")"
return e
+++ do v <- identifier
let a = (find (==(head v)) vlist)
return a
我收到错误,因为find返回一个Maybe,我需要它返回一个Float或者给用户一个错误信息。我该怎么做?
答案 0 :(得分:3)
我不确定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
}
]
答案 1 :(得分:0)
也许通过像这样的case x of
块运行它:
case find x of (Just y) -> --your code here
Nothing -> error "Wrong"