2012-04-15 20 views
5

par聲明爲:Haskell:爲什麼「par」定義了它的樣子?

par :: a -> b -> b 

注意,這樣的說法是一個扔掉。爲了使用par,你需要玩多個技巧,例如多次使用同一個表達式。

如果它的目的是在並行地執行A和B,爲什麼沒有像這樣定義?:

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

以的(未計算的)表達式的元組,並返回相同的表達 - 而他們可能正在後臺線程上實現。

看來後者的模型比前者簡單。爲什麼選擇這種設計?

+2

的機制,我覺得想想你的版本更加困難。你傳給對手的那對可能是沒有評價的。誰評估它,何時評估? – augustss 2012-04-16 07:15:50

回答

8

在前者,你可以很容易引發兩個以上的計算,

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

這將是後者相當麻煩。

+0

後者可能超載最多8個參數,並且也有一個列表版本。 – usr 2012-04-15 22:26:43

+0

注意,這個參數被拋棄了,這意味着只有你的例子中的c4會存活下來(沒有更多的技巧)。 – usr 2012-04-15 22:28:56

+0

你會如何超載? 'class par a where'和最多8元組的實例?啊。 – 2012-04-15 22:28:58

7

你建議tupled版本可以在Control.Parallel.Strategies發現爲parTuple2,與類型:

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

至於爲什麼面值是這樣設計的,齊名是「更高的層次」,爲Real World Haskell討論第24章,在那裏他們並行化快速排序:

這些變化對我們的代碼是顯着所有我們都不需要 的東西說。

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

A Monad for Deterministic Parallelism,馬洛,牛頓,佩頓 - 瓊斯寫:

票面運營商是一個有吸引力的語言設計,因爲它 利用了懶惰的評價和期貨之間的重疊。 要實現惰性評估,我們必須有 表達式,但尚未評估它們的值,但可能需要稍後 ;同樣的未來是一種計算,其價值正在被並行評估,我們可能會等待。 因此,標準桿被設想爲註釋懶惰 計算爲潛在的有利可圖的並行計算,實際上 把一個懶惰計算成未來

相關問題