我遇到了一个带有列表并返回选项列表的递归函数的问题。例如,函数all_except_one
:
val all_except_one : 'a -> 'a list -> 'a list option = <fun>
从列表中删除第一次出现的'a
。如果列表中没有'a
,您应该返回None
。
没有选项我的代码看起来像这样:
let same_string s1 s2 =
s1 = s2
let rec all_except_one str str_l =
match str_l with
| [] -> []
| hd::tl -> if same_string hd str
then tl
else hd::(all_except_one str tl)
但是每当我尝试添加选项时,它都会在进行递归调用时受到阻碍。
答案 0 :(得分:4)
option list
看起来像[ None; Some "abc"; None ]
。我想你想要list option
,看起来像Some ["a"; "b"; "c"]
或None
。
至于你的主要问题,你必须处理案件的递归调用。如果递归调用返回None,则也会返回None。如果递归调用返回Some list
,则返回Some (longer list)
。您还需要重新考虑基本情况(当列表为空时),我想说。
答案 1 :(得分:0)
说实话,当您可以使用same_string
时,我不明白为什么您需要=
功能。
我建议你实现你想要的功能:
let rec all_except_one str str_l = match str_l with
| [] -> None
| hd :: tl -> if hd = str then Some tl else
match all_except_one str tl with
| None -> None
| Some x -> Some (hd :: x)
您案件中出现问题的原因是什么?
答案 2 :(得分:0)
对递归调用的结果进行匹配的替代方法是使用accumulator参数编写辅助函数:
let remove_first elt list =
let rec loop acc = function
| [] -> None
| x::xs ->
if x = elt then Some (List.rev_append acc xs)
else loop (x::acc) xs in
loop [] list
这样做的一个小优点是循环变为尾递归。