tl; dr; Typ jest nadrzędnym abstrakcji nad kontynuacją
Kontynuacją jest rodzaj danych wejściowych i wyjściowych
Najbardziej zbliżoną do kontynuacji nieopartej na procedurach jest prawdopodobnie monada kontynuacji w Haskell, ponieważ jest wyrażona jako typ, dla którego można użyć wielu funkcji do interakcji z typem w celu przerwania, wznowienia, cofnięcia i innych.
Możesz zamknąć to zamknięcie w typ, taki jak Cont
typ w Haskell, w którym otrzymujesz abstrakcję monady jako „abstrakcję wyższego poziomu”, a istnieją inne formy abstrakcji nad kontynuacjami, które otrzymasz, gdy spojrzysz na kontynuację jako typ zamiast po prostu procedura , na przykład
- Możesz wziąć dwie kontynuacje i zrobić alternatywę między nimi, jeśli typ przestrzega praw, aby być monoidem
- Możesz streścić na typie, aby zmienić typ kontynuacji lub wejścia kontynuacji, jeśli zamkniesz zamknięcie w typie zgodnym z prawami funktora
- Możesz dowolnie i częściowo zastosować lub ozdobić swoją kontynuację funkcjami, takimi jak walidacja lub konwersja danych wejściowych, jeśli zamkniesz zamknięcie w typie zgodnym z prawami funktora aplikacyjnego
Zamknięcie a procedura
Pod koniec dnia masz rację; kontynuacja jest „procedurą”, choć wolałbym nazywać ją „zamknięciem”. Często kontynuacje są najlepiej wyrażane jako zamknięcia pierwszej klasy, które otaczają ograniczone środowisko. W czysto funkcjonalnym języku można powiedzieć, że nie jest to szczególnie uzasadnione, ponieważ brakuje referencji; jest to prawda, ale można zawrzeć wartości, a pojedyncze przypisanie sprawia, że zawarcie wartości względem odwołania jest dokładnie takie samo. To powoduje w Haskell:
(\x -> \y -> insideYIcanAccess x (and y))
Język, który nie ma możliwości zamknięcia wiążącego środowiska, może technicznie nie mieć zamknięć pierwszej klasy, ale nawet wtedy istnieje pewne środowisko (ogólnie globalne), które jest dostępne dla zamknięcia.
Powiedziałbym więc, że dokładniej jest opisać kontynuację jako: Zamknięcie jest używane w określony sposób.
Wniosek
Na pytanie „Czy kontynuację można wdrożyć w jakikolwiek inny sposób niż procedurę?” Nie. Jeśli nie masz funkcji pierwszej klasy , tak naprawdę nie możesz mieć kontynuacji jako takiej (tak wskaźniki funkcji liczą się jako funkcje pierwszej klasy, więc alternatywnie wystarczający może być dowolny dostęp do pamięci).
Teraz pytanie: „Czy są jakieś sposoby na wyrażenie kontynuacji w sposób bardziej abstrakcyjny niż procedura?” Wyrażenie go jako typu daje znacznie większą abstrakcję, pozwalając traktować kontynuację w bardzo ogólny sposób, dzięki czemu możesz wchodzić w interakcję z kontynuacją na wiele innych sposobów niż tylko jej wykonanie.