使用OCaml中的选项和列表

时间:2013-10-17 23:32:15

标签: recursion ocaml options

我遇到了一个带有列表并返回选项列表的递归函数的问题。例如,函数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)

但是每当我尝试添加选项时,它都会在进行递归调用时受到阻碍。

3 个答案:

答案 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

这样做的一个小优点是循环变为尾递归。