我正在尝试在Ocaml中实现List.map函数的并发版本。我知道模块Async.Std.Deferred.List中有一个类似的功能,但在这里我只是试图自己攻击它。
这就是我所拥有的:
let deferred_listmap (f : 'a -> 'b Deferred.t) (l : 'a list) =
let f' acc elem =
(f elem) >>= fun s ->
return (acc@[s]) in
List.fold_left f' [] l
显然这里有一个类型匹配错误,因为fold_left需要一个带有类型的函数f('b list - >'a - >'b list),而f'我这里有类型(' b list - >'a - >'b list deferred.t)。但是对于这个我无法帮助,因为我在这里使用bind(>> =),它期望其函数参数的返回类型是延迟类型。所以我在这里遇到了一些矛盾,我想不出其他用于绑定或折叠或List模块中的其他功能来解决这个问题。有什么建议?
答案 0 :(得分:1)
我猜您可以尝试使用Thread
和Event
模块。
open Thread
open Event
let tapply f ls =
let res =
List.map (fun e ->
let c = new_channel () in
let _ = create (fun c -> send c (f e) |> sync) c in
receive c) ls in
List.map sync res
示例:
# tapply (fun e -> delay 3.0; e*e) [17;573;2;6;3];;
- : int list = [289; 328329; 4; 36; 9] (*waiting time only 3 sec, not 15*)