Tho*_*mas 0 ocaml tail-recursion ocsigen ocaml-lwt
可以使用Lwt.return作为递归函数的最终调用吗?
我有一个编译正常但功能不正常的函数,它看起来像f下面的函数.请假设g在此示例中提供的任何功能都没有问题,我基本上只是试图找出是否可以使用以下形式的函数,或者是否有更好/更简单(和Lwt兼容)的方式做以下事情:
let rec f (x : string list) (g : string -> unit Lwt.t) =
match List.length x with
| 0 -> Lwt.return ()
| _ -> g (List.hd x) >>= fun () -> f (List.tl x) g
;;
val f : string list -> (string -> unit Lwt.t) -> unit Lwt.t = <fun>
Run Code Online (Sandbox Code Playgroud)
我很确定我做错了.但是我使用的实际功能比这个例子复杂得多,所以我很难调试它.
首先,在OCaml中处理列表的正确方法是使用模式匹配来解构它们,如下所示:
let rec f (xs : string list) (g : string -> unit Lwt.t) =
match xs with
| [] -> return ()
| x :: xs -> g x >>= fun () -> f xs g
Run Code Online (Sandbox Code Playgroud)
下一步将是注意,您实际上只是在列表上执行迭代.这有一个Lwt_list.iter_s:
let f g xs = Lwt_list.iter_s g xs
Run Code Online (Sandbox Code Playgroud)
这可以简化得更多
let f = Lwt_list.iter_s
Run Code Online (Sandbox Code Playgroud)
这意味着,你甚至不需要编写这样的功能,因为它已经存在了.
最后,在原始实现中没有递归问题.您提供的函数是尾递归.
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |