OCaml数值比较函数异常求助:始终返回z问题排查
解决你的OCaml函数返回异常问题
嘿,我看到你遇到的这个小问题啦!作为OCaml新手,模式匹配里的变量绑定规则确实容易踩坑,咱们来一步步弄明白怎么回事~
问题出在哪?
你写的代码是这样的:
let test x y z = match x with | y when x = y -> z | _ -> x
这里的关键问题是:match分支里的y并不是你函数参数中的那个y!
在OCaml的模式匹配规则里,以小写字母开头的标识符会被当作全新的变量绑定——也就是说,这里的y是把x的值重新绑定到了一个叫y的新变量上,而不是和你传入的参数y做比较。那后面的when x = y其实就等价于x = x,这永远是true,所以不管你传入的x和y是否相等,第一个分支都会被触发,自然就总是返回z啦!
正确的写法有这些
方法1:用简单的if-else(最直观)
因为你的逻辑很直接,用if-else反而更清晰:
let test x y z = if x = y then z else x
方法2:修正模式匹配的写法
如果你想用match表达式,可以把分支里的y换成_,再通过when条件来判断x和参数y是否相等:
let test x y z = match x with | _ when x = y -> z | _ -> x
或者也可以匹配x和y组成的元组,这样逻辑更明确:
let test x y z = match (x, y) with | (a, b) when a = b -> z | (a, _) -> a
小提醒
以后写模式匹配的时候要记住:小写开头的名字是用来绑定新值的,如果你想引用外部已经存在的变量,要么用when条件做判断,要么使用大写开头的构造器(比如处理变体类型的时候)。
内容的提问来源于stack exchange,提问作者hjskeqwe
相关产品推荐
相关产品推荐

