Według mojego zrozumienia, funkcje częściowe są funkcjami, które otrzymujemy, przekazując do funkcji mniej parametrów niż oczekiwano. Na przykład, jeśli byłoby to bezpośrednio poprawne w Pythonie:
>>> def add(x,y):
... return x+y
...
>>> new_function = add(1)
>>> new_function(2)
3
W powyższym fragmencie new_function
znajduje się funkcja częściowa. Jednak według Haskell Wiki definicja funkcji częściowej to
Funkcja częściowa to funkcja, która nie jest zdefiniowana dla wszystkich możliwych argumentów określonego typu.
więc moje pytanie brzmi: co dokładnie oznacza „funkcja częściowa”?
python
haskell
functional-programming
partial-application
partial-functions
Saurabh kukade
źródło
źródło
partial
wykonuje częściową aplikację , podczas gdy Haskell robi to automatycznie. Wpis wiki odnosi się do funkcji częściowych , które są terminem z matematyki.add 3 5
nie jest aplikacją jednofunkcyjną. To pierwsze dotyczyadd
3, aby uzyskać nową funkcję, która następnie jest stosowana do 5.partial
metoda jest deklaracją do przodu opcjonalnie zaimplementowanej metody prywatnej w innym miejscu w bazie kodu projektu.new_function = functools.partial(add, 1)
Odpowiedzi:
Jesteś tutaj, myląc dwie koncepcje. Częściowo stosowana funkcja [Haskell, encyklopedia] z częściowym funkcji [Haskell, encyklopedia] .
Częściowo zastosowana funkcja to:
mając na uwadze, że funkcja częściowa rzeczywiście jest funkcją niecałkowitą:
źródło
Funkcja częściowa (zarówno w kontekście programowania funkcjonalnego, jak i matematyki) jest dokładnie tym, co mówi wiki: funkcja nieokreślona dla wszystkich możliwych argumentów. W kontekście programowania zwykle interpretujemy „nieokreślony” jako jedną z kilku rzeczy, w tym niezdefiniowane zachowanie, wyjątki lub brak wypowiedzenia.
Przykładem funkcji częściowej może być dzielenie liczb całkowitych, które nie jest zdefiniowane, jeśli dzielnik ma wartość 0 (w Haskell zgłosi błąd).
Ten kod po prostu spowodowałby błąd w Pythonie, ale gdyby działał tak, jak zamierzałeś, byłby to funkcja całkowita (czyli nie częściowa).
Jak już zauważyli komentatorzy, najprawdopodobniej myślisz o tym, że byłaby to funkcja częściowo zastosowana .
źródło
Odpowiedzi wyjaśniają wszystko, dodam tylko jeden przykład w każdym języku:
nie jest to ani funkcja częściowa, ani funkcja curry , to tylko funkcja, której nie podałeś wszystkich argumentów .
Funkcja curry w pythonie powinna wyglądać tak:
i w haskell:
Funkcja częściowa w pythonie:
I w Haskell, jak pokazał twój link :
Cóż, w zasadzie odwrotnie: jest to funkcja, która będzie działać dla każdego wejścia tego typu. Oto przykład w pythonie:
i to działa nawet w przypadku list nieskończonych, jeśli użyjesz małej sztuczki:
I odpowiednik w Haskell:
Tutaj funkcje nie zawieszają się na zawsze. Koncepcja jest taka sama: dla każdej listy funkcja będzie działać.
źródło