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模塊中綁定或摺疊或其他功能的其他用途來解決這個問題。有什麼建議麼?
如果您正在使用從ocaml的編譯器分別來庫,也許你應該指出? – didierc 2014-11-02 03:35:05
現在,如果您使用'Async'實用程序來重新實現此功能,我想'Async.Std.Deferred.all'會很方便(並且實際上是真正的功能使用)。該函數又可以使用列表中的「both」(在同一模塊中)的摺疊來實現。 – didierc 2014-11-02 03:48:46
顯然這取決於你是什麼意思與併發。每個地圖是否應該在另一個線程上完成? (就像@Oleg的例子)還是應該以n個項目的塊來完成?爲了回答更多細節需要 – denis631 2017-11-30 14:45:58