2009-08-20 12 views
13

Czytałem o kontynuacji techniki przekazywania stylu programowania (implementacja C# 3.0).Kiedy i jak korzystać z kontynuacji stylu przechodzenia

Dlaczego/kiedy przydałaby się ta technika?

Jak mogę to wdrożyć, aby uzyskać te naprawdę długie łańcuchy? Czy to jest to samo, co currying (co daje lepsze wyniki wyszukiwania w google)?

Dzięki

Odpowiedz

12

excellent write-up na CPS w C# kontekście powstał Wes Dyer. Nie sądzę, żebym mógł dodać coś znaczącego. Jeśli jakieś konkretne rzeczy są niejasne, śmiało pytaj o nie.

+1

+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) –

+2

"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

+0

@Eage: Odmawiam przyjęcia tego negatywnego wyroku. Jeden nie tylko porównuje kontynuacje do goto. to daleko idące. –

5

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.

Powiązane problemy