You are on page 1of 4

Curry i uncurry - czyli jak odpowiednio doprawia nasze

programy
Micha Zajc
20 stycznia 2015

Spis treci
1 Wstp
1.1 O tym dokumencie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Currying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2
2
2

2 Zadania na wiczeniach
2.1 Tre . . . . . . . . .
2.2 curry3 . . . . . . . .
2.3 Co tu si dzieje? . . .
2.4 uncurry3 . . . . . . .
2.5 Co tu si dzieje? . . .

2
2
2
2
3
3

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

3 Co z tego mam?

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

Wstp

1.1

O tym dokumencie

O curry i uncurry jest dostpnych wiele materiaw, po co wic kolejny? Ten dokument powsta z
myl o ludziach realizujcych kurs Paradygmaty programowania pod przewodnictwem Waszmocia
znanego jako dr in. Zdzisaw Spawski na Wydziale Imprez i Zabaw...wr...Informatki i Zarzdzania na Politechnice Wrocawskiej. Prowadzcy ten ma dosy specyficzny sposb prowadzenia zaj
(chwaa mu za to). Jedni nie rozumiej, inni kompletnie tego rozumiej a jeszcze innym si wydaje e
rozumiej. S te tacy ktrym udaje si w kocu zrozumie o co Waszmo tak mczy tych biednych
studentw. Mam nadziej e dokument ten sprawi e, szybciej ni ja, znajdziecie si w grupie tych
ostatnich.

1.2

Currying

Sam currying nie jest niczym nowym bo wpad na niego niejaki Rosjanin o imieniu Moisei Isaievich
Sheinfinkel w 1967 roku i zgodnie z prawem Baeza operacja ta zostaa nazwana nazwiskiem Haskella Curryego ktry t magi rozwin i spopularyzowa. Swoj drog imieniem drugiego z panw
nazwano inny jzyk funkcyjny.
Poznalimy troch historii wic pora na zasadnicze pytanie: co to ustrojstwo robi? Proste. Currying jest procesem transformacji (zmiany) funkcji n-argumentowych na sekwencj n
funkcji jednoargumentowych.
Spjrzmy na przykad zaczerpnity z Wikipedii - mamy funkcj f (x, y) = y/x i chcemy obliczy
f (2, 3). Najpierw wstawmy za x liczb 2. Otrzymujemy wtedy funkcj zmiennej y ktr moemy
oznaczy jako g(y) = f (2, y) = y/2. Teraz za y moemy wstawi 3 i otrzymamy g(3) = f (3, 2) = 3/2.
Jeeli si dobrze przyjrze to wanie uylimy dwch funkcji jednoargumentowych. Ot caa filozofia.

Zadania na wiczeniach

Jak wida powyej zagadnienie niby proste a na wiczeniach 90% osb ley. Rozpatrzmy to wic z
perspektywy zada na wiczeniach.

2.1

Tre

Zdefiniuj funkcje curry3 i uncurry3, przeprowadzajce konwersj midzy zwinitymi i rozwinitymi


postaciami funkcji od trzech argumentw. Podaj ich typy.

2.2

curry3

Najpierw musimy sobie zdefiniowa tak funkcj. Funkcja ta ma zwraca pewn funkcj f (x, y, z) w
postaci rozwinitej. Wiemy zatem e curry3 jako argument przyjmuje funkcj biorc jako argument jedn trjelementow krotk i funkcja ta zwraca wynik jakiego typu. Do dziea:
# let curry3 f x y z = f (x , y , z ) ; ;
val c u r r y 3 : ( a b c > d ) > a > b > c > d = <fun>

2.3

Co tu si dzieje?

Jak byo napisane wczeniej, curry3 przyjmuje jako argument inn funkcj, ktra jako argument
przyjmuje trjelementow krotk, i zwraca j w postaci rozwinitej. Naley pamita e operator
typu > czy si w prawo wic drug linijk moemy zapisa tak:
2

val c u r r y 3 : ( ( a b c ) > d ) > ( a > b > c > d ) = <fun>


atwo teraz mona zobaczy e argument dla curry3 w istocie jest funkcj biorc trjelementow
krotk (interpreter OCamla krotki oznacza jako a * b * c) i zwracajc element typu d. Drugi
nawias natomiast pokazuje e typem zwrotnym curry3 jest sekwencja funkcji jednoargumentowych

2.4

uncurry3

Musimy teraz zrobi funckj ktra odwraca taki proces. Powinno to by ju mniej czy bardziej
logiczne.
# l e t uncurry3 f ( x , y , z ) = f x y z ; ;
val uncurry3 ( a > b > c > d ) > a b c > d = <fun>

2.5

Co tu si dzieje?

Dokadnie odwrotnie ni w curry3. Jako argument podajemy funkcj w postaci rozwinitej i otrzymujemy j w postaci zwinitej. Na wszelki wypadek poniej sygnatura funkcji w dodatkowymi nawiasami:
val uncurry3 : ( a > b > c > d ) > ( ( a b c ) > d ) = <fun>

Co z tego mam?

Zapyta mona si: co to jest ta posta rozwinita i co ona mi daje? Dobre pytanie - postaram si
na nie odpowiedzie.
Wemy na warsztat nastpujc, opatologiczn funkcj:
# let plus a b = a + b ; ;
val p l u s : i n t > i n t > i n t = <fun>
Kilka pyta dla ludzi wytrwaych:
1. Jaki jest typ plus?
2. Jaki jest typ plus 2 3 ?
3. Jaki jest typ plus 2 ?
Pierwsze dwa powinny by proste. Natomiast co z pytaniem 3? plus 2 wydaje si by bdem.
Tak jednak nie jest. Interpreter OCamla po wpisaniu:
# plus 2 ; ;
Wesoo wypluwa na ekranie:
: i n t > i n t = <fun>
Co tu si stao? Proste - OCaml zwrci nam funkcje ktra przyjmuje argument typu int i zwraca
wynik typu int. Przyjrzyjmy si temu bliej.
# let f = plus 2 ; ;
val f : i n t > i n t = <fun>
# f 10;;
: i n t = 12
# f 26;;
: i n t = 28
3

Jakby nie patrze wanie stworzylimy funkcj ktra przyjmuje argument typu int i dodaje do
niego 2. Takie co nazywa si partial application i o ile mi wiadomo jest jedn z lepszych rzeczy
na jakie pozwala nam rozwinita posta funkcji. Przy uyciu tej cechy jzykw funkcyjnych moemy
bardzo szybko tworzy nowe funkcje w oparciu o inne, istniejce ju funkcje. Mona to traktowa jako
klocki LEGO tylko e zamiast klockw mamy funkcje. Podany przykad moe nie jest najbardziej
uyteczny ale szybko ilustuje o co mi chodzi. Za nieco bardziej rozbudowany przykad moe posuy
funkcja multiply ktra mnoy elementy listy przez n:
# let multiply n l i s t =
let f x =
n x in
L i s t . map f l i s t ; ;
Stworzenie funkcji triple sprowadza si teraz do:
# let t r i p l e = multiply 3

You might also like