OCaml解引用指针时match语句始终匹配成功问题求解
OCaml模式匹配异常问题原因解答
核心原因
你遇到的问题是OCaml模式匹配的基础规则导致的:
- 模式匹配分支中出现的小写开头标识符,默认是新建局部变量,用于绑定当前匹配到的值,不会和外层作用域的同名变量做相等性比较。
你的原代码中match !myStr with | newS -> true的写法,不管!myStr是什么值,都会命中第一个分支:匹配所有值,将其绑定到新的局部变量newS(和外层函数的参数newS完全是两个变量),直接返回true,后续的_分支永远不会执行,因此两次调用都返回true。
修复方案
如果你想在模式匹配中实现和指定变量的相等性判断,有两种可行方式:
- 改用相等判断的if语句,也就是你已经验证可行的写法:
if (!myStr = newS) then true else false
- 给模式匹配分支加
when守卫实现值比较:
match !myStr with | x when x = newS -> true | _ -> false
补充说明
只有当模式里出现的是常量、大写开头的构造器、字面量时,模式匹配才会直接做值比较,比如下面的写法是符合预期的:
match !myStr with | "right" -> true (* 字符串常量匹配,会做值比较 *) | _ -> false
内容的提问来源于stack exchange,提问作者LargeLizard
相关产品推荐
相关产品推荐

