2010-03-13 33 views
22

我很努力去理解當值的類型爲A @cpsParam[B,C]時它究竟意味着什麼,我應該將這種形式分配給什麼類型我在使用分隔延續設施時的值。不明白Scala定界延續的輸入(A @cpsParam [B,C])

我看了一些資料來源:

http://lamp.epfl.ch/~rompf/continuations-icfp09.pdf

http://www.scala-lang.org/node/2096

http://dcsobral.blogspot.com/2009/07/delimited-continuations-explained-in.html

http://blog.richdougherty.com/2009/02/delimited-continuations-in-scala_24.html

,但他們並沒有給我太多的直覺到這個。在最後一個鏈接中,作者試圖給出一個明確的解釋,但無論如何它還不夠清楚。

這裏的A表示計算的輸出,它也是其延續的輸入。 B表示該繼續的返回類型,C表示其「最終」返回類型 - 因爲轉換可以對返回值進行進一步處理並更改其類型。

我不明白「計算輸出」,「延續的返回類型」和「延續的最終返回類型」之間的區別。它們聽起來像同義詞。

+2

當人們不能看到我的博客文章時,我總是很傷心:http://suereth.blogspot.com/2010/03/how-you-should-think-about-delimited.html 我請詳細說明這一點,因爲這讓我非常沮喪地看着互聯網上現有的資源。 – jsuereth 2011-03-16 01:11:51

+0

謝謝喬希,我會看看你的帖子。 – jkff 2011-03-16 10:31:23

回答

20

所以,人們在別處幫助我。下面是答案:

reset ({ 
    ... 
    ...shift((k:A=>B) => ...::C)::A... 
    ... 
}::B)::C 

所以,shiftA類型的B類型的計算{...}一個洞。 shift的參數返回C類型的值,這就是爲什麼reset ({...})的類型爲C

理解這個東西的關鍵技巧是看到{...}reset {...}具有不同的類型,具體取決於shift的參數返回的類型。

例如:

reset ({ 
    "number "+shift((k:Int=>String) => List(k(1), k(2), k(3))) 
}) 

返回List("number 1", "number 2", "number 3")

這裏AIntBStringCList[String]因爲{"number" + _}是(在這裏)從IntString一個功能和shift的說法,因爲函數,產生一個List[String],這成爲reset({...})的結果。

+0

非常好的解釋! – hotzen 2010-03-17 14:12:39

1

我仍然在計算出這裏涉及的確切的輸入規則/含義。

如果示例中的類型「足夠簡單」以便像上面所示的那樣「很好地適應」,它似乎更容易/更容易,但是它與輸入給出的東西相比,會變得更加中間/困難(至少對我而言) tiark rompf:

|- e: [email protected][B,C]; {[|r|]}: U 
----------------------------------------------------- 
[|val x: A = e; r|] = [|e|].map((x: A) => {[|r|]}) 

所以[|e|].map((x: A) => {[|r|]})結果將根據tiark的論文給出地圖的定義有型Shift[U,B,C]

這裏U的不一定是相同的B.

到目前爲止,我不明白爲什麼U被允許在沒有東西是不同於B像tiark的紙地圖的定義給出 U <: B

我在這裏錯過了什麼?

任何提示/想法?

相關問題