OCaml解释器扩展实现列表判空出现Match_failure异常如何解决
问题修复说明
根因分析
- 你在
>>=后定义的匿名函数仅使用了v1::v2这一种非空列表匹配模式,没有覆盖空列表[]的场景,编译器会抛出非exhaustive匹配告警,运行时传入空列表就会触发匹配失败异常 - 原有代码中的相等判断逻辑冗余:只要匹配到
v1::v2模式,就说明当前是至少包含一个元素的非空列表,ListVal ([]) = ListVal (v1::v2)的判断永远为假,没有实际作用
正确实现
直接对list_of_listVal返回的原生列表做全模式匹配即可,覆盖空、非空两种场景:
| Empty(e1) -> eval_expr e1 >>= list_of_listVal >>= function | [] -> return @@ BoolVal(true) | _ :: _ -> return @@ BoolVal(false)
这种写法覆盖了所有列表场景,不会再触发匹配告警,传入空列表时会正确返回BoolVal true,非空列表返回BoolVal false,非列表值的错误处理逻辑由之前的list_of_listVal保留,符合你原本的设计要求。
内容的提问来源于stack exchange,提问作者eznora
相关产品推荐
相关产品推荐

