搜索haskell列表

时间:2012-03-27 02:48:12

标签: haskell return

所以我有这个计算器,我正在构建接受用户变量输入,如“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或者给用户一个错误信息。我该怎么做?

2 个答案:

答案 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"