【问题标题】:Non-exhaustive patterns in lambda errorlambda 错误中的非详尽模式
【发布时间】:2014-12-11 21:39:41
【问题描述】:

在 Haskell 中实现一个简单的解析器后,我运行以下示例代码来测试我的解析器。

example = fst $ (\(Just x)->x) $ parse (tokenize "assign x := not(and(true, false)); print x; assign a := not(and(x, x)); print a; end;") :: Stmt

它返回 Exception: Parse.hs:93:18-29: Non-exhaustive patterns in lambda

我在这里做错了什么可能是导致此错误的原因?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    您最终将 Nothing 输入 lambda (\(Just x) -> x),从而导致非详尽的模式匹配错误。相反,使用maybe 函数:

    default_value :: Stmt
    default_value = ???
    
    maybe default_value fst $ parse (tokenize "...") :: Stmt
    

    【讨论】:

    • 如果我知道我正在解析的字符串不应该返回错误,这是否意味着我在某处实现了解析器错误?
    • @user3277633 这是我能做出的唯一假设。这是您显示的代码中唯一的模式,如果这是发生错误的地方,那么您将从解析器中获取 Nothing
    【解决方案2】:

    在您的 lambda (\(Just x)->x) 中,您需要考虑其参数可能是 Nothing 的可能性。

    试试这个:

    hdlr (Just x) = x
    hdlr Nothing = error "Failed"
    
    example = fst $ hdlr $ parse (tokenize "assign x := not(and(true, false)); print x; assign a := not(and(x, x)); print a; end;") :: Stmt
    

    【讨论】:

    • 如果我知道我正在解析的字符串不应该返回错误,这是否意味着我在某处实现了解析器错误?
    • 是的,您将 Nothing 传递给 lambda,尝试使用我在上面放置的代码,您会很快看到是否收到“失败”错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2019-01-25
    相关资源
    最近更新 更多