我正在尝试重写这段代码,但没有“匹配”,只能使用
List.hd
,List.tl
,和List.length
被接受。
有没有人可以赐教一下?
let rec listes_paires l = match l with
| [] -> []
| x :: r -> if List.length x mod 2 = 0 then (x :: (listes_paires r))
else ((x@x):: (listes_paires r));;
match l with [] -> []
到底是什么意思? “如果l
是一个空列表,返回一个空列表。”您可以通过将长度与 0
进行比较来完成此操作,这相当于一个空列表。
let rec listes_paires l =
if List.length l = 0 then []
else ...
在 else 中,我们现在 知道 列表至少有一个元素长,因此我们可以安全地使用
List.hd l
和 List.tl l
。您可以使用本地 let 绑定将名称 x
和 r
绑定到这些。
注意:
List.length
是O(n),所以在递归函数中使用它是低效的。如果你不能模式匹配,那么也许你可以使用List.compare_length_with
。或者正如 Jeffrey 指出的那样,只需测试与空列表是否相等[]
.
顺便说一句,考虑到像
List.hd
和List.tl
这样的函数是如何实现的,带有这种限制的赋值有点讽刺。
let hd = function [] -> failwith "hd" | a::l -> a let tl = function [] -> failwith "tl" | a::l -> l