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

Haskell模式匹配中标记不可达分支的标准方法

在Haskell模式匹配中标记不可达分支的标准方式

在标准Haskell里,标记这类逻辑上不可达的模式匹配分支,确实有几种被广泛接受的标准写法,我结合你提到的Aeson场景给你捋捋最常用的几个:

  • error 或 errorWithoutStackTrace:这是生产代码里最常用的选择,尤其适合你这种“自己生成的数据,理论上绝不会走到其他分支”的场景。你可以写带明确提示信息的error,万一真的出了问题(比如生成逻辑偷偷改了没同步),能快速定位问题。举个Aeson的例子:

    import Data.Aeson (Value(Object), Object)
    
    processMyGeneratedValue :: Value -> Object
    processMyGeneratedValue (Object obj) = obj
    processMyGeneratedValue _ = error "Internal error: Expected Object type from our own generated JSON"
    

    如果你确定不需要栈追踪信息(毕竟是逻辑错误,不是运行时异常),可以用base库提供的errorWithoutStackTrace,它和error功能一致,但不会生成栈跟踪,性能略好一点。

  • undefined:这是最简洁的写法,但几乎没有调试价值——出问题时你只会看到undefined的报错,完全不知道哪里出了问题。一般只适合快速原型开发,或者非常局部、明确的小场景,比如:

    processMyGeneratedValue :: Value -> Object
    processMyGeneratedValue (Object obj) = obj
    processMyGeneratedValue _ = undefined
    

    真心不推荐在生产代码里用这个,调试起来太头疼。

  • panic:来自base库的GHC.Stack模块,它和error类似,但会强制生成栈追踪信息,适合你需要尽可能多调试线索的场景。用法和error差不多,但需要加上HasCallStack约束来启用栈追踪:

    import Data.Aeson (Value(Object), Object)
    import GHC.Stack (HasCallStack, panic)
    
    processMyGeneratedValue :: HasCallStack => Value -> Object
    processMyGeneratedValue (Object obj) = obj
    processMyGeneratedValue _ = panic "Internal error: Expected Object type from our own generated JSON"
    

总结一下:如果是生产代码,优先选带明确信息的error或errorWithoutStackTrace;原型阶段可以用undefined;需要详细调试信息时用panic。这些都是标准Haskell(仅依赖base库)的写法,完全符合你的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:27:27