Aby odpowiedzieć na ostatnie pytanie, styl przekazywania kontynuacji to nie to samo, co curry. Stosujesz curry, gdy tworzysz funkcję z innej funkcji, podając jeden lub więcej jej parametrów, uzyskując funkcję o mniejszej liczbie parametrów. Currying w funkcjonalnym języku programowania, takim jak F # i C# w pewnym zakresie, pozwala traktować wszystkie funkcje jako funkcje jednej zmiennej. Jeśli wspomniana funkcja ma więcej niż jeden parametr, może być postrzegana jako posiadająca parametr i zwracająca inną funkcję z pozostałymi parametrami. To jest przykład currying w C#:
public static class FuncExtensions
{
public static Func<A, Func<R>> Curry<A, R>(this Func<A, R> f)
{
return a =>() => f(a);
}
}
Func<int, int> f = x => x + 1;
Func<int> curried = f.Curry()(1);
Jeżeli curry funkcja zawsze zwraca 2. Istnieją oczywiście bardziej wiecania zastosowania tego produktu.
Jeśli chodzi o styl przekazywania kontynuacji, oprócz bloga Wes Dyer, do którego prowadzą odnośniki, zajrzyj do przepływów pracy asynchronicznych F #, które są instancjami kontynuacji lub kontynuacją monady. Możesz spróbować użyć terminu kontynuacja monada, aby znaleźć dodatkowe artykuły.
+1 Bardzo dobry odczyt: "Większość programistów używa funkcji, które pobierają wywołanie zwrotne Często wywołanie zwrotne jest kodem wywoływanym po zakończeniu funkcji, w tych przypadkach wywołanie zwrotne jest jawnie przekazywaną kontynuacją." (z artykułu) –
"Kontynuacje są funkcjonalnymi odpowiednikami GOTO, zarówno pod względem mocy, jak i nieprzenikalności, mogą wyrażać dowolny przepływ sterowania, na przykład coroutines i wyjątki, jednocześnie drażniąc jednych z najjaśniejszych programistów." - mogą zwariować. Rozpocznij miksowanie kontynuacji niepowodzeń, kontynuacji sukcesów i więcej, i możesz wykonać szalone operacje AI-esque w kilkudziesięciu liniach trudnego do zrozumienia-ale-pięknego kodu. – Eagle
@Eage: Odmawiam przyjęcia tego negatywnego wyroku. Jeden nie tylko porównuje kontynuacje do goto. to daleko idące. –