22

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はその「最終」戻りタイプを表します。これは、shiftが戻り値に対してさらに処理を実行し、そのタイプを変更できるためです。

「計算の出力」、「継続の戻り型」、「継続の最終戻り型」の違いがわかりません。それらは同義語のように聞こえます。

4

2 に答える 2

20

それで、人々は他の場所でこれを手伝ってくれました。答えは次のとおりです。

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

つまり、タイプの計算におけるタイプshiftの穴です。の引数は型の値を返します。そのため、型はです。A{...}BshiftCreset ({...})C

このことを理解する上での重要な秘訣は、それを確認し{...}、引数が返すreset {...}タイプに応じてタイプを変えることでした。shift

例えば:

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

を返しますList("number 1", "number 2", "number 3")

ここAIntBStringCですList[String]。これは、から{"number" + _}の関数であり、その関数が与えられた場合のの引数は、の結果となる、を生成するためです。IntStringshiftList[String]reset({...})

于 2010-03-14T05:46:48.933 に答える
1

私はまだここに含まれる正確なタイピングルール/含意を理解する過程にあります。

例のタイプが上記のように「うまく収まる」のに「十分に単純」である場合は簡単/簡単に思えますが、tiark rompfによるタイピングと比較すると(少なくとも私にとっては)より興味深く/困難になります。

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

したがって、の結果は、tiarkの論文で与えられたマップの定義に従っ[|e|].map( (x: A) => {[|r|]} )たタイプになります。Shift[U,B,C]

ここで、Uは必ずしもBと同じではありません。

U <: Bこれまでのところ、tiarkの論文のマップの定義に示されているようなものがなければ、UがBと異なることが許可されている理由がわかりません 。

ここでそれぞれ理解できないのは何ですか?

ヒント/アイデアはありますか?

于 2010-11-16T17:04:57.200 に答える