gpt4 book ai didi

haskell - 处理 `case`时如何避免 `Maybe`

转载 作者:行者123 更新时间:2023-12-02 17:41:39 25 4
gpt4 key购买 nike

我正在用 Haskell 编写解释器,并且我有 map: name_of_function -> 函数定义。

Map String Defun

我的解释器单子(monad):

type InterpreterMonad  = StateT (EnvFun, (Stack EnvEval)) (ErrorT String IO ) ()

正如你所看到的,“最后一个”monad 是 ErroT

现在,当我想要处理调用函数时:

   handleFCall :: Stmt -> InterpreterMonad
handleFCall (VarName name) args = get >>= \(envFun, contextStack) -> case (Map.lookup (VarName name) envFun) of
Nothing -> throwError "Err"
(Just x) -> DoSthOther

正如你所看到的,我必须使用case。但是我正在使用 >>= 所以我想在这里避免 case of 。但是,Map.lookup 在失败时返回 Nothing,我想添加我的错误消息。

我没有 Haskell 经验,所以我不知道如何处理它。此外,欢迎对我的代码提出任何批评。

干杯。

最佳答案

使用 case 语句没有任何问题,尽管使用 do 表示法重新格式化后,您的函数看起来更像

handleFCall (VarName name) args = do
(envFun, contextStack) <- get
case Map.lookup (VarName name) envFun of
Nothing -> throwError "Err"
Just x -> doSthOther x

这对于其他 Haskell 程序员来说会更熟悉。但是,如果您确实想避免使用案例,只需使用 maybe 函数即可:

handleFCall (VarName name) args = do
(envFun, contextStack) <- get
maybe (throwError "Err") doSthOther $ Map.lookup (VarName name) envFun

或者使用>>=

handleFCall (VarName name) args
= get >>=
(\(envFun, contextStack) ->
maybe (throwError "Err") doSthOther
$ Map.lookup (VarName name) envFun
)

但我个人认为 case 语句更具可读性。

关于haskell - 处理 `case`时如何避免 `Maybe`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36924441/

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