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


8

論文「代数的効果とハンドラーのための効果システム」のサブタイプについて質問がありました。ハンドラー型の両側にエフェクトを追加するためのサブタイピングルールがないのはなぜですか?

T!AR!BT!(AC)R!(BC)

これは、ハンドラータイプの変数を左側にあるハンドラータイプよりも多くの効果を持つ計算に適用する場合に役立ちます。

ハンドラーの入力規則を使用して、ハンドラー型の両側に効果を追加できますが、これは変数では機能しません。たとえば、ハンドラーが関数の引数である場合。

回答:


9

Andrejと私はかなり長い間このルールを追加することを検討しており、その正しさを証明したと信じているため、この質問が頻繁に出されないことに驚いています。しかし、結局のところ、少なくとも値による呼び出しの設定では、これは誤りであることがわかりました(プッシュ値による呼び出しでうまく機能すると聞いています)。

同じ論文の24ページで説明されている状態ハンドラーについて考えてみましょう。このハンドラーは、状態でタイプステートフル計算を実行し、それをからへの純粋な関数に変換します。そのタイプは右側にある2つの空のセットに注意してください。1つ目は、結果の関数が純粋であることを示し、2つ目は、この関数の生成時に影響が発生しないことを示しています。BAAB

B!{lookup,update}(AB!)!

ここで、ハンドラーを計算に適用して、と以外の呼び出すと仮定します。提案されたルールを適用すると、タイプ が、実際には正しいタイプは 未処理の効果としてのは、関数の生成前または呼び出し後に発生する可能性があります。Δlookupupdate

B!({lookup,update}Δ)(AB!)!Δ
B!({lookup,update}Δ)(AB!Δ)!Δ
Δ

1
ありがとうMatija!このルールがないことでどうやって逃げるのですか?(インラインではない場合に)状態ハンドラーを、ルックアップと更新以外の効果がある計算にどのように適用できますか?すべてのハンドラーをインライン化する必要があると思いますか?
Labbekak

1
let-polymorphism(リンクした論文には含まれていません)を回避して、タイプを割り当てることができますをハンドラーに。このトピックに関する最新のESOPペーパーを参照してください。A,B,Δ.B!({lookup,update}Δ)(AB!Δ)!Δ
Matija Pretnar 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.