如何在ocaml中执行List.map的并发版本?

时间:2014-11-01 23:03:52

标签: ocaml

我正在尝试在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模块中的其他功能来解决这个问题。有什么建议?

1 个答案:

答案 0 :(得分:1)

我猜您可以尝试使用ThreadEvent模块。

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