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::[] -> ...
捕获“最后一个元素”/“单个元素列表”的情况。
所以我目前正在用 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::[] -> ...
捕获“最后一个元素”/“单个元素列表”的情况。