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);;