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函数,触发了作用域错误。
修复方案
有两种常见修复方式:
- 导入
Control.Monad模块:在代码最顶部添加导入语句,仅导入guard函数即可:import Control.Monad (guard) - 用
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
相关产品推荐
相关产品推荐

