2014-11-01 42 views
1

我想在Ocaml中實現List.map函數的併發版本。我知道在模塊Async.Std.Deferred.List中有類似的功能,但在這裏我只是試圖自己攻擊這個。如何在ocaml中執行List.map的併發版本?

以下是我有:

let deferred_listmap (f : 'a -> 'b Deferred.t) (l : 'a list) = 
let f' acc elem = 
    (f elem) >>= fun s -> 
    return ([email protected][s]) in 
List.fold_left f' [] l 

而且顯然是有一種類型的匹配誤差在這裏,因爲fold_left需要一個函數f型( 'B列表 - >' A - >「B名單)而我在這裏的f是類型('b list - >'a - >'b list Deferred.t)。但爲此,我無法幫助,因爲我在這裏使用了一個bind(>> =),它期望函數參數的返回類型是一個延遲類型。所以我在這裏遇到了一些矛盾,我不能想到在List模塊中綁定或摺疊或其他功能的其他用途來解決這個問題。有什麼建議麼?

+0

如果您正在使用從ocaml的編譯器分別來庫,也許你應該指出? – didierc 2014-11-02 03:35:05

+0

現在,如果您使用'Async'實用程序來重新實現此功能,我想'Async.Std.Deferred.all'會很方便(並且實際上是真正的功能使用)。該函數又可以使用列表中的「both」(在同一模塊中)的摺疊來實現。 – didierc 2014-11-02 03:48:46

+0

顯然這取決於你是什麼意思與併發。每個地圖是否應該在另一個線程上完成? (就像@Oleg的例子)還是應該以n個項目的塊來完成?爲了回答更多細節需要 – denis631 2017-11-30 14:45:58

回答

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