You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell错误咨询:‘guard :: Bool -> Maybe a0’变量未在作用域内属于何种错误?

Haskell作用域错误分析:Variable not in scope: guard :: Bool -> Maybe a0

错误类型

这是函数未在作用域内的错误,属于Haskell的作用域检查类错误——编译器无法找到代码中使用的guard函数定义。

问题原因

guard函数不属于Haskell默认导入的Prelude模块,它是Control.Monad模块下的函数。代码直接调用了guard但未提前导入对应模块,导致编译器无法识别该函数。

代码问题点

在ExpDiv分支的这段代码中:

(\y' -> guard (y'/=0) >> return (div x'y'))

未导入guard函数,触发了作用域错误。

修复方案

有两种常见修复方式:

  1. 导入Control.Monad模块:在代码最顶部添加导入语句,仅导入guard函数即可:
    import Control.Monad (guard)
    
  2. 用Maybe原生逻辑替代guard:无需导入模块,直接通过条件判断实现相同逻辑:
    (\y' -> if y' /= 0 then return (div x' y') else Nothing)
    

完整修复后示例代码(导入模块版本)

import Control.Monad (guard)

data Exp = Const Integer | ExpAdd Exp Exp | ExpMult Exp Exp | ExpDiv Exp Exp

eval3 :: Exp -> Maybe Integer
eval3 e =
  case e of
    (Const x) -> pure x
    (ExpAdd x y) -> eval3 x >>= \x' -> eval3 y >>= \y' -> return (x'+y')
    (ExpMult x y) -> eval3 x >>= \x' -> eval3 y >>= \y' -> return (x'*y')
    (ExpDiv x y) -> eval3 x >>= \x' -> eval3 y >>= (\y' -> guard (y'/=0) >> return (div x' y'))

内容的提问来源于stack exchange,提问作者user20556088

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:46:03