Ocaml循环尾递归

时间:2017-09-30 18:59:51

标签: list ocaml tail-recursion

我基本完成了我的作业,因为我只需要一定数量的工作测试示例。我唯一的问题是我无法弄清楚为什么这不起作用,我想知道我的理智。

let list_helper (x: 'a -> bool) head = if (x head) then true else false
let take_while (x: 'a -> bool) lst = 
    let rec take_while_helper x lst acc = match lst with
    | [] -> []
    | h::t -> if list_helper x h then take_while_helper x t (h::acc) else acc in take_while_helper x lst []
  • take_while (fun _ -> true) [1; 2; 3]应评估为[1; 2; 3]。这个不起作用。
  • take_while ((=) "a") ["a"; "a"; "b"; "a"]应评估为["a"; "a"]。按预期工作。
  • take_while (fun _ -> false) ["say"; "anything"]应评估为[]。按预期工作。

最后两个测试用例有效,但第一个测试用例没有。我做了另一个类似的功能,再次它不起作用。看来我的函数不能很好地处理整数,我不知道为什么。我想知道为什么它的行为不正确,因为我从逻辑上看它似乎应该有效。也许我错过了有关整数和列表的内容。

1 个答案:

答案 0 :(得分:0)

如果是空列表,您还必须返回累加器。而且你必须反转结果,因为你以错误的顺序将元素添加到累加器。

所以你的功能看起来像

let take_while (x: 'a -> bool) lst = 
  let rec take_while_helper lst acc = match lst with
  | [] -> acc
  | h::t -> if x h then (take_while_helper t (h::acc)) else acc
  in List.rev (take_while_helper lst [])