Ocaml 惰性列表的良好“分区”实现?

Ocaml 惰性列表的良好“分区”实现?,ocaml,Ocaml,实现分区功能的最佳/有效方法是什么 这是我的实现 type 'a lazy_list_t = Cons of 'a * (unit -> 'a lazy_list_t) 我认为它很容易阅读,但缺点是对于每个元素,f实际上应用了两次 有更好的方法吗?我会致力于: let rec filter f (Cons (x, tl_f)) = if f x then Cons (x, fun () -> filter f (tl_f())) else filter f (tl_f())

实现
分区
功能的最佳/有效方法是什么

这是我的实现

type 'a lazy_list_t = Cons of 'a * (unit -> 'a lazy_list_t)
我认为它很容易阅读,但缺点是对于每个元素,
f
实际上应用了两次

有更好的方法吗?

我会致力于:

let rec filter f (Cons (x, tl_f)) =
  if f x then Cons (x, fun () -> filter f (tl_f()))
  else filter f (tl_f())

let partition f ll = filter f ll, filter (fun x -> f x |> not) ll
这样你就可以写下一个懒惰的对折,最终得到一个懒惰的配分函数。 例如这样的东西:

let rec fold_right f ll b =
  match ll with
    [] -> b
  | x :: xs -> f x (fold_right f xs b);;

let partition f ll = 
  let f_split v (tt, ff) = 
    if f v = true then (v::tt,ff) else (tt,v::ff) in 
    fold_right f_split ll ([], []);; 

您可以
映射到产生
[(f v,v),…]
的列表上,然后在该列表上使用
过滤器
两次。这将对每个元素只应用一次
f
。@DanD。好主意。你们能扩展你们的注释来回答我的问题吗?这样我就可以标记为正确。你们能为惰性分区函数写一个代码吗?
let rec fold_right f (Cons(x, xs)) b =
  f x (fold_right f (xs()) b);;