gpt4 book ai didi

haskell - 搜索 haskell 列表

转载 作者:行者123 更新时间:2023-12-02 00:23:36 25 4
gpt4 key购买 nike

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

最佳答案

我不确定 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
}
]

关于haskell - 搜索 haskell 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9882713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com