5

マルチプロンプトで区切られた継続のためのAPIは、OCamlのDelimited Control、Abstractly and ConcretelySystemDescriptionの論文で説明されています。

私の質問はのタイプに関するものですpush_subcont : ('a,'b) subcont -> (unit -> 'a) -> 'b。なぜこのタイプではないの('a,'b) subcont -> 'a -> 'bですか?さらに、なぜsubcontsに別のタイプがあるのですか?なぜ単純ではないのです('a,'b) subcont = 'a -> 'bか?オレグは物事を可能な限りエレガントにするので(しかしよりエレガントではない)、それには正当な理由があるとほぼ確信しています。

ありがとう!

4

1 に答える 1

5

どうして('a,'b) subcont -> 'a -> 'b

push_promptわかりやすいのと同じ理由だと思います。push_prompt p (fun () -> e)は直感的に次の形式ですtry e with p。プロンプトpはハンドラーとしてスタックに配置され、eこのハンドラーの下で実行されます。代わりに使用した場合push_prompt p e、厳密な言語は最初に引数pを評価し、プロンプトが設定される前に実行して「例外を発生」させます。ee

push_subcont sk (fun () -> e)同じ種類の問題が発生する可能性があります。これは、「sk例外によって中断された計算を再開する」という種類の直感的な問題です。eたとえば、によってインストールされたハンドラーに対応する例外を発生させたい場合は、計算の外部ではなく、計算のコンテキスト内で実行することが重要ですsk

なぜ単純ではないのです('a,'b) subcont = 'a -> 'bか?

これは、サブ継続を再開する方法が1つしかない場合に実行できます。つまり、サブ継続を適用すると、指定された引数で再開する関数の形式で、「事前に再開」された状態で返される可能性があります。

push_subcontしかし、そうではありませんpush_delim_subcont。記事の最後に説明されているように、異なるセマンティクスを持つとがあります。「発信者」は、使用する再起動手法を選択する必要があります。どちらもサブコンティニュエーションの内部データにアクセスする必要があるため、関数としてのサブコンティニュエーション表現を操作できませんでした。

于 2012-05-13T09:47:41.983 に答える