簡體   English   中英

Haskell:為什么`par`定義它的方式?

[英]Haskell: Why was `par` defined the way it was?

par被聲明為:

par  :: a -> b -> b

請注意,該論點被拋棄了。 為了使用par,你需要多次使用同一個表達式。

如果它的目的是並行執行a和b,為什么它不是這樣定義的?:

par  :: (a, b) -> (a, b)

獲取(未評估的)表達式的元組並返回相同的表達式 - 同時它們可能在后台線程上實現。

似乎后者的模型比前者簡單。 為什么選擇這樣的設計?

在前者中,您可以輕松地激發兩次以上的計算,

c1 `par` c2 `par` c3 `par` c4 `pseq` something c1 c2 c3 c4

這在后者中相當麻煩。

您建議的tupled版本可以在Control.Parallel.Strategies中找到parTuple2,類型如下:

evalTuple2 :: Strategy a -> Strategy b -> Strategy (a, b)

至於為什么par是這樣設計的, par是'更高級別',正如Real World Haskell的第24章所討論的那樣,他們將快速排序並行化:

我們代碼的這些變化對於我們不需要說的所有事情都是非常了不起的。

  • 要使用多少個核心。
  • 什么線程可以相互通信。
  • 如何在可用核心之間划分工作。
  • 哪些數據在線程之間共享,哪些是私有的。
  • 如何確定所有參與者何時完成。

確定性並行性的Monad中 ,Marlow,Newton和Peyton Jones寫道:

par運算符是一種有吸引力的語言設計,因為它利用了懶惰評估和期貨之間的重疊。 為了實現延遲評估,我們必須對尚未評估但稍后可能需要其值的表達式進行表示; 類似地,未來是一種計算,其價值正在並行評估,我們可能會等待。 因此,par被認為是一種機制,用於將惰性計算注釋為可能的並行計算表,實際上將惰性計算轉化為未來

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM