康納麥克布萊德的和Ross帕特森的經典論文 Applicative programming with effects 示出了「矩陣的計算」換位例如:請求澄清
transpose :: [[a]] -> [[a]]
transpose [] = repeat []
transpose (xs : xss) = zipWith (:) xs (transpose xss)
transpose
使用的「的視圖採集點」列表:它將 函數(此處爲(:)
)和輸入元素並生成產生的 輸出列表。
因此,鑑於
v = [[1,2,3],[4,5,6]]
然後
transpose v
結果
[[1,4],[2,5],[3,6]]
在論文後來他們說
如果我們要爲做同樣的我們轉置示例,我們將不得不 避免圖書館的「成功的名單」(Wadler,1985)單子,並採取 而不是支持「量化」的實例Applicative []
, 其中pure = repeat
和(~) = zapp
,產生
transpose'' :: [[a]] -> [[a]]
transpose'' [] = pure []
transpose'' (xs : xss) = pure (:) <*> xs <*> transpose'' xss
這裏,transpose''
使用列表的「視圖的非確定性計算點 」:它將函數(這裏是(:)
)應用於 轉彎中的輸入。
因此
transpose'' v
結果
[[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
我覺得我錯過了一些微妙的一點。我可以看到transpose
是 的確使用 列表的集合觀點來轉置「向量」。但transpose''
(使用非確定性計算 列表的觀點)似乎與矢量 換位無關。
換句話說,transpose
和transpose''
似乎是不相關的 函數 - 不同的例子。我錯過了什麼嗎?
註釋「我們不得不避免圖書館的「成功清單」,這就是說,我們*不*使用「不排除」雙重計算觀點「。 –
明白了 - 謝謝 – haroldcarr
請注意,'Control.Applicative'中有一個'newtype ZipList',具有完全顯示的行爲。 – Xeo