tl; dr; タイプ継続を超える包括的抽象化です
継続は、その入力と出力のタイプです
非手続きベースの継続に最も近いのは、Haskellの継続モナドです。です。これは型として表現され、割り込み、再開、バックトラックなどの型と対話するために多くの関数を使用できます。
そのようなクロージャーを次のようなタイプにカプセル化できます。 Cont
ますとして継続を見たときあなたが得るあなたが「より高いレベルの抽象化」とモナドの抽象化を取得Haskellでは種類、および抽象化の他の形態は、継続の上にあるタイプの代わりに、たとえば、単にプロシージャ
- タイプがモノイドになるように法則に従う場合、2つの継続を取り、それらの間で代替を行うことができます
- ファンクターの法則に従う型でクロージャーをカプセル化する場合、型を抽象化して継続の入力または出力型を変更できます
- の法則に従う型でクロージャーをカプセル化する場合、入力検証や入力変換などの機能を使用して、任意に部分的に継続を適用または装飾できます。 ファンクターの
閉鎖と手順
結局のところ、あなたは基本的に正しいです。継続は「手順」ですが、私はむしろそれをクロージャと呼びます。多くの場合、継続は、バインドされた環境を囲むファーストクラスのクロージャーとして最も適切に表現されます。純粋な関数型言語では、参照がないため、これは特に合理的ではないと言うかもしれません。これは事実ですが、値を囲むことができ、単一の割り当てにより、値と参照を囲むことはまったく同じになります。これにより、Haskellが発生します。
(\x -> \y -> insideYIcanAccess x (and y))
バインディング環境を囲む能力を欠く言語は、技術的にはファーストクラスのクロージャーを欠くかもしれませんが、それでもあります が利用できるいくつかの環境(一般的にはグローバル)があります。
したがって、継続を次のように記述する方が正確だと思います。 ます。特定の方法で使用されるクロージャ。
結論
「継続はプロシージャ以外の方法で実装可能ですか?」の質問に対して いいえ。ファーストクラス関数がない場合は、実際に継続することはできません(関数ポインタはファーストクラス関数としてカウントされるため、代わりに任意のメモリアクセスで十分です)。
ここで、「プロシージャよりも抽象的な方法で継続を表現する方法はありますか?」それを型として表現すると、はるかに大きな抽象化が得られ、継続を非常に一般的な方法で扱うことができ、継続と実行するだけでなく、より多くの方法で継続と対話できます。