OCaml 正在打印一个额外的值

OCaml is printing one extra value

所以我目前正在用 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] 将始终 return 最后一个元素.. 即使它是奇数(您不 运行 检查它)。应该类似于 | [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::[] -> ...

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