我基本完成了我的作业,因为我只需要一定数量的工作测试示例。我唯一的问题是我无法弄清楚为什么这不起作用,我想知道我的理智。
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"]
应评估为[]
。按预期工作。最后两个测试用例有效,但第一个测试用例没有。我做了另一个类似的功能,再次它不起作用。看来我的函数不能很好地处理整数,我不知道为什么。我想知道为什么它的行为不正确,因为我从逻辑上看它似乎应该有效。也许我错过了有关整数和列表的内容。
答案 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 [])