OCaml正在打印一项额外价值

问题描述

所以我目前正在OCaml中编码,我应该使用提供给我的功能打印所有偶数。由于某些原因,当我输入[1; 2; 3; 4; 5]时,我的输出为[2; 4; 5]而不是[2; 4]。有谁知道为什么? 下面的代码是匹配语句,用于连接偶数。

let rec rem x n = match x with
|[]->[]
|[h]->[h]
|(h)::t-> if n(h) = false then h:: rem t n else rem t n;;

解决方法

您的匹配器| [h] -> [h]将始终返回最后一个元素..即使它是奇数(您不对其进行检查)。应该是| [h] -> if n(h) = false then [h] else []之类的东西(可能是反逻辑,因为我不确定n到底在做什么)。

,

您必须删除

| [h] ->[h]

行。
在您的示例中,当您到达

| 4::[5] -> if n(4) = false then 4 :: rem [5] n else rem [5] n

然后您将输入

| [5] -> [5]

不检查!n(5)
没有它,您的模式匹配就已经完成(反之,ocaml也会抱怨),因为

| 5::[] -> ...

捕获“最后一个元素” /“单个元素列表”的情况。