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
相关产品推荐
相关产品推荐

