2014-09-15 11 views
5

Próbuję zrozumieć curry czytając różne blogi i układając odpowiedzi na temat przepływu i myślę, że zrozumiałem co. W Haskell, każda funkcja jest curry, to znaczy, gdy masz funkcję jak
f x y = x + y
to naprawdę
((f x) y)
w tym funkcja początkowo wziąć pierwszy parametr „x” jako parametr i częściowo dotyczy to funkcjonować f, który z kolei zwraca funkcję dla y. gdzie wystarczy jeden parametr i stosuje się funkcję. W obu przypadkach funkcja przyjmuje tylko jeden parametr, a także proces zmniejszania funkcji do przyjmowania pojedynczego parametru nazywany jest "curry". Popraw mnie, jeśli rozumiem źle tutaj.
Więc jeśli jest poprawna, czy możesz mi powiedzieć, czy funkcje "dwa" i "trzy" są funkcjami curry?
Czy poniższy kod naprawdę zagniewa się w haskell?

three x y z = x + y + z 
two = three 1 
same = two 1 

W tym przypadku, mam dwie wyspecjalizowane funkcje, „dwa” i „samo”, które są redukowane wziąć tylko jeden parametr, więc jest to curry?

+2

Możesz go przetestować samodzielnie, używając polecenia ': t' w GHCi (': t three' wyświetli typ 'trzy'). – Mephy

+0

świetnie, nie wiedziałem o tym. dzięki. – Nair

+0

@JoshuaHannah - może widzisz to tutaj. Z pewnością nie oznaczało to żadnego wykroczenia lub usunięcia twojej odpowiedzi - miałem tylko nadzieję, że dodasz trochę przydatnych informacji dla Naira - przepraszam – Carsten

Odpowiedz

4

Najpierw przyjrzyjmy się two. Ma podpis

two :: Num a => a -> a -> a 

zapomnieć o Num a do teraz (to tylko ograniczeniem a - można przeczytać Int tutaj). Z pewnością jest to również funkcja curry.

Kolejnym z nich jest bardziej interesujący:

same :: Num a => a -> a 

(btw: ładne imię - to samo ale nie dokładnie id ^^)

TBH: I don nie wiem na pewno.

Najlepszym definicja Znam curry funkcji to:

curry funkcja jest funkcją N argumentów powracających inną funkcję (n-1) argumentów.

(jeśli chcesz, możesz do tego stopnia pełni curry funkcji oczywiście)

To będzie pasować tylko w przypadku definiowania stałych jako funkcje z parametrami: 0 - co na pewno można. Więc powiedziałbym tak (?) To też jest curry funkcja ale tylko w Mathy borderline sposób (jak suma 0 liczb określonym być 0)

1

Można by pomyśleć, że three funkcja z anonimowymi funkcjami to:

three = \x -> (\y -> (\z -> x + y + z))) 
4

Najlepiej tylko pomyśl o tym równania.Poniżej znajdują się wszystkie równoważne definicje:

f x  y  z = x+y+z 
f x  y = \z -> x+y+z 
f x = \y -> (\z -> x+y+z) 
f = \x -> (\y -> (\z -> x+y+z)) 

Częściowa aplikacja jest tutaj tylko styczna. Najczęściej nie chcesz, aby faktyczna aplikacja częściowa została wykonana, a rzeczywisty obiekt lambda zostanie utworzony w pamięci - mając nadzieję, że zamiast tego kompilator użyje - i zoptymalizuje lepiej - pełną definicję w końcowym punkcie pełnej aplikacji.

Obecność funkcji curry/uncurry to kolejny problem mylące. Zarówno f (x,y) = ... i f x y = ... są curry w Haskell, oczywiście, ale w naszych głowach mamy tendencję do myśleć o pierwszym w funkcji dwóch argumentów, więc funkcje tłumaczenia pomiędzy dwoma formami są nazwane curry i uncurry, jako mnemoniczny.

Powiązane problemy