取消引用指针 OCaml 时匹配始终成功

Lar*_*ard 0 ocaml

我的代码如下

let newObj (s) : someObj = 
   let myStr = ref s in
   let myInt = ref 0 in {
       someFun = (fun newS ->
           match !myStr with
           | newS -> true
           | _ -> false
   }
;;
Run Code Online (Sandbox Code Playgroud)

我已经测试过这段代码

let test = newObj "right";;
test.someFun "right";;
test.someFun "wrong";;
Run Code Online (Sandbox Code Playgroud)

对 someFun 的两次调用都返回 true。

我也尝试过

if (!mystr = newS) then true else false
Run Code Online (Sandbox Code Playgroud)

这有效。为什么?

Jef*_*eld 5

模式中标识符的含义并不是您想象的那样。模式中出现的任何标识符都是id 的出现,它将绑定到任何匹配的值。那么,这场比赛:

       match !myStr with
       | newS -> true
       | _ -> false
Run Code Online (Sandbox Code Playgroud)

将始终匹配第一个案例。它将标识符绑定newS到值!myStr;但是,这没有明显的效果,因为您没有newS在关联的表达式中使用。

模式newS中的 与标识符之前的任何出现无关newS。这是标识符的新用途。

这就是该if声明有效的原因。它指的是标识符的现有绑定(不涉及模式)。

正如我旁注的那样,当我输入上面的表达式时,编译器会警告我如下:

Warning 11: this match case is unused.
Run Code Online (Sandbox Code Playgroud)

编译器指出匹配的第二个分支永远不会被使用。第一个分支始终匹配。

注意这样的警告是有好处的。