「代数的効果とハンドラのための効果システム」におけるハンドラのサブタイプ化に関する質問

「代数的効果とハンドラのエフェクトシステム」のサブタイプに関する質問がありました。私は、なぜハンドラタイプの両側にエフェクトを追加するためのサブタイプ化ルールがないのだろうかと思っていました。

$$ frac { } { T!A ; Rightarrow ; R!B ; leqslant ; T!(A
cup C); Rightarrow ; R!(B cup C) } $$

これは、ハンドラ型を持つ変数を左辺にあるハンドラ型より多くの影響を伴う計算に適用する場合に便利です。

ハンドラのタイピングルールを使用してハンドラタイプの両側にエフェクトを追加することはできますが、それは変数に対しては機能しません。たとえば、ハンドラが関数の引数である場合。

ベストアンサー

私はAndrejのために、この質問をもっと頻繁には受け取っていないのに驚いています。私はかなり長い間このルールを追加することを検討し、その正しさを証明したと信じています。しかし、最終的には、少なくともコールバイバリューの設定では間違っていることが判明しました(私はそれをプッシュ値で呼び出せると聞いています)。

同じ紙の24ページの上部に記載されている状態ハンドラを考えてみましょう。このハンドラは、状態$ A $に対して$ B
$型のステートフルな計算を行い、$ A $から$ B $までの純関数に変換します。そのタイプは$$ B! { mathtt
{lookup}、 mathtt {update} } Rightarrow(A からB! emptyset)です!
emptyset
$$右側の2つの空のセットに注意してください。最初のものは、結果の関数が純粋であることを示し、2番目の関数は、この関数を生成するときに何の影響も生じません。

ここで、$ mathtt {lookup} $と$ mathtt {update} $以外の他のエフェクト$
Delta $を呼び出す計算にハンドラを適用するとします。提案されたルールを適用すると、$$ B!( { mathtt
{lookup}、 mathtt {update} } cup Delta) Rightarrow(A からB!
emptyset)のタイプが得られます。 デルタ$$ 実際、正しいタイプは $$ B!( { mathtt {lookup}、
mathtt {更新} } cup Delta) Rightarrow(A からB! Delta) デルタ$$
関数の生成前または呼び出し後に未処理の影響$ Delta $が発生する可能性があるためです。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です