2010-04-27 14 views
9

Moje zrozumienie currying (oparte na pytaniach SO) polega na tym, że pozwala częściowo ustawić parametry funkcji i zwrócić jako wynik funkcję "obciętą".Czy curry jest sposobem na uniknięcie dziedziczenia?

Jeśli masz duży funkcja owłosione trwa 10 parametrów i wygląda

function (location, type, gender, jumpShot%, SSN, vegetarian, salary) { 
    //weird stuff 
} 

i chcesz funkcję „podzbiór”, który pozwoli Ci uporać z pamięcią dla wszystkich, ale jumpShot%, powinien po prostu nie wydzielić klasę, która dziedziczy po pierwotnej funkcji?

Przypuszczam, że to, czego szukam, jest przypadkiem użycia tego wzorca. Dzięki!

Odpowiedz

1

w JavaScript Mam currying na funkcje zwrotne (ponieważ nie mogą być przekazywane żadnych parametrów po ich nazwie (od rozmówcy)

Więc coś takiego:

... 
var test = "something specifically set in this function"; 
onSuccess: this.returnCallback.curry(test).bind(this), 

// This will fail (because this would pass the var and possibly change it should the function be run elsewhere 
onSuccess: this.returnCallback.bind(this,test), 
... 

// this has 2 params, but in the ajax callback, only the 'ajaxResponse' is passed, so I have to use curry 
returnCallback: function(thePassedVar, ajaxResponse){ 
    // now in here i can have 'thePassedVar', if 
} 

Nie jestem pewien, czy było to wystarczająco szczegółowe lub spójne ... ale programowanie w zasadzie pozwala "wstępnie wypełnić" parametry i zwrócić puste wywołanie funkcji, które ma już wypełnione dane (zamiast wymagać wypełnienia tych informacji w innym miejscu).

5

Currying has wiele zastosowań. Od sim Ply określa parametry domyślne dla często używanych funkcji do zwracania wyspecjalizowanych funkcji, które służą do określonego celu.

Ale podam następujący przykład:

function log_message(log_level, message){} 
log_error = curry(log_message, ERROR) 
log_warning = curry(log_message, WARNING) 

log_message(WARNING, 'This would be a warning') 
log_warning('This would also be a warning') 
1

Podczas programowania w stylu funkcjonalnym, często wiążą się argumenty, aby wygenerować nowe funkcje (w tym przykładzie, orzeczników) ze starych. Pseudo-kod:

filter(bind_second(greater_than, 5), some_list) 

może być równoznaczne z:

filter({x : x > 5}, some_list) 

gdzie {x : x > 5} jest anonimowy definicję funkcji. To znaczy, konstruuje listę wszystkich wartości z some_list, które są większe niż 5.

0

W wielu przypadkach parametry do pominięcia nie będą znane w czasie kompilacji, ale raczej w czasie wykonywania. Co więcej, nie ma ograniczenia liczby delegatów, którzy mogą istnieć dla danej funkcji. Następujące elementy są adaptowane z programu rzeczywistego.

Mam system, w którym wysyłam pakiety poleceń do komputera zdalnego i odbieram pakiety zwrotne. Każdy pakiet poleceń ma numer indeksu, a każda odpowiedź nosi numer indeksu polecenia, do którego jest odpowiedzią. Typowe polecenie przetłumaczone na język angielski może brzmieć "daj mi 128 bajtów zaczynając od adresu 0x12300". Typową odpowiedzią może być "Sukces". wraz ze 128 bajtami danych.

Aby obsłużyć komunikację, mam procedurę, która akceptuje wiele pakietów poleceń, każdy z delegatem. Po otrzymaniu każdej odpowiedzi odpowiedni delegat zostanie uruchomiony na odebranych danych. Delegat powiązany z powyższym poleceniem może brzmieć "Potwierdź, że dostałem" sukces "z 128 bajtami danych, a jeśli tak, to przechowuj je w moim buforze pod adresem 0x12300". Zauważ, że wiele pakietów może być wyjątkowych w danym momencie; Parametr curried address jest niezbędny do tego, aby procedura wiedziała, gdzie powinny się znaleźć dane przychodzące.Nawet gdybym chciał napisać procedurę "przechowuj dane do bufora", która nie wymagałaby parametru adresu, nie wiedziałaby ona, dokąd powinny dotrzeć dane przychodzące.

Powiązane problemy