Thursday, December 14, 2017

Odgovor na Python meetup komentar

Specijalni je slučaj iteratora onaj koji vraća iste vrijednosti svaki puta. 
Matematički je neosporno da onih drugih ma beskonačno puta više.
Npr, next() bi mogao jednostavno vraćati i neku random vrijednost. To bi i dalje bio iterator, ali se ne može reversati.
S obzirom da se samo konačno podijeljeno sa beskonačno iteratora može reversati, to je zaista poseban slučaj.
Ako već hoćeš biti sasvim principijelan, onda je pravo pitanje zašto uopće postoje liste. Odgovor je, naravno, "Although practicality beats purity."
Hoćeš matematiku? Evo ti onda par matematički neospornih stvari. :-D

1. Svih funkcija sa Z u Z ima neprebrojivo mnogo (kontinuum). Svih source kodova u bilo kojem programskom jeziku koji implementiraju neku funkciju sa Z u Z ima prebrojivo mnogo (alef_0). Dakle, ima samo zanemarivo funkcija koje uopće možemo implementirati. Zašto uopće koristimo takav formalizam (programske jezike) koji hvata samo zanemariv dio općeg prostora funkcija? :-P

2. I za općenite tipove (ne samo Z -> Z), svih implementabilnih (izračunljivih) funkcija ima beskonačno mnogo. No u svakom konkretnom trenutku, do tog trenutka smo implementirali samo konačno mnogo njih, dakle zanemarivo malo u odnosu na opći prostor onih koje možemo implementirati. Zašto se uopće bavimo programiranjem? :-P

3. Čak i za funkcije koje jesmo implementirali, ako im je domena beskonačna, one zapravo bilo koji element od beskonačno mnogo njih mogu funkcijskim pozivom preslikati u element kodomene koji vrate. No do svakog konkretnog trenutka, izvršili smo samo konačno mogo funkcijskih poziva, dakle npr. za funkciju iz Z u Z, pokrili smo zanemarivo malen dio općeg interfacea jedne konkretne funkcije. Zašto uopće pokrećemo naše aplikacije? :-P

Odgovor na sva tri pitanja je isti: kardinalni broj skupa je vrlo jadna procjena važnosti / korisnosti njegovih elemenata. Naravno da su Reversible iteratori specijalan slučaj, ali su važan specijalni slučaj, koji se pojavljuje daleko češće nego da slučajno piknemo neki element općeg prostora iteratora.

Liste imaju svoju svrhu postojanja i u sasvim čistom platonističkom programiranju: random access, i držanje vlastitih elemenata _na različitim mjestima u isto vrijeme_, je važan aspekt programiranja, čak i apstraktnog. Iteratori drže svoje elemente _na istom "mjestu" u različitim vremenima_, i kao takvi su sasvim ortogonalni na liste, iako, kao što ćemo pokazati, nema nikakvog bitnog razloga da mnogi od njih ne podržavaju random access također.

No comments: