Forum » Programiranje » Transducerji v funkcijskih jezikih
Transducerji v funkcijskih jezikih
Spura ::
Clojure, Lisp, Haskell - če hočeš širiti obzorja na programerskem področju.
Sam trenutno delam na tem, da zaštekam transducerje.
Kaj pa je tukaj tezkega? Koncno so implementiral kombiniranje operacij, kar je osnovni predpogoj, da funkcijsko programiranje neha smrdet.
ZaphodBB ::
Kaj pa je tukaj tezkega? Koncno so implementiral kombiniranje operacij, kar je osnovni predpogoj, da funkcijsko programiranje neha smrdet.
Zelo dobro razumem transducerje kot operacijo. To ni problem. Nisem pa še tako daleč, da bi si pridobil intuicijo za izvedbo posamične transformacije v obliki transducerja.
Kar se pa tvojega odnosa tiče, če bi bilo to tako očitno, bi se verjetno že kdo prej spomnil a ne?
"Naši dedje so se borili za to, da lahko odločamo
o lastni usodi - ne o usodi drugih ljudi." -jype
o lastni usodi - ne o usodi drugih ljudi." -jype
noraguta ::
Clojure, Lisp, Haskell - če hočeš širiti obzorja na programerskem področju.
Sam trenutno delam na tem, da zaštekam transducerje.
Kaj pa je tukaj tezkega? Koncno so implementiral kombiniranje operacij, kar je osnovni predpogoj, da funkcijsko programiranje neha smrdet.
no kompozitum funkcij ni nič novega. že nekaj desetletij. tu gre pa na prvi uč neko kombinacijo folda in kompozituma. pa še to v homoiconik jezikih drugje moraš isto stvar prevefrjat v compile timu.
drugac gre pa zato da ti ni treba kompozituma priredit tretji funkciji ampak jih namečeš kot parametre nad nekim seznamom. ne pršpra velik.
Pust' ot pobyedy k pobyedye vyedyot!
Mavrik ::
Kaj pa je tukaj tezkega? Koncno so implementiral kombiniranje operacij, kar je osnovni predpogoj, da funkcijsko programiranje neha smrdet.
Če bi dejansko pobliže pogledal video, bi pogruntal da je fora v resnici v tem da se znebiš nepotrebnih alokacij, ki jih tako veriženje operatorjev zelo rado generira (še posebej v jezikih, ki niso optimizirani za take pogoje, npr. C#, Java, itd.). Dajte ne pizdit kar neki na pamet no.
The truth is rarely pure and never simple.
noraguta ::
clojure sam to sebi niti ne pozna operatorjev. glede alokacij v objektnem pa ja. to drži. ampak kompozitum mapirat na nek fold, spet ni neki revolucionarnga. niti generalizacija.
Pust' ot pobyedy k pobyedye vyedyot!
technolog ::
Mavrik, povečana hitrost je zgolj stranski učinek, ne pa glavni namen. Optimizacija je naloga compilerja. Če je compiler ali pa VM (v tem primerju JVM) zanič, ni programer kriv za to.
Kakor sem jaz razumel, je naloga transducerjev to, da lahko narediš generičen transformer, ki deluje nad poljubno monado oz. zaporedjem.
Kakor sem jaz razumel, je naloga transducerjev to, da lahko narediš generičen transformer, ki deluje nad poljubno monado oz. zaporedjem.
fiction ::
Sem pogledal video o transducerjih pa moram rečt, da gre za zanimiv koncept, ne razumem pa, zakaj tak hype okoli tega. Meni izgleda vse skupaj kot posplošitev osnovnih gradnikov funkcijskega programiranja (map, fold, filter).
Map vzame neko funkcijo in jo izvede po vseh elementih seznama. Ampak "težava" je v tem, da je vhod in izhod seznam in tako se mora tudi map zavedati, kako sestavljati seznam. Mapping je kolikor razumem samo funkcija, ki dobi kot parameter tudi način kako sestavljati elemente (privzeto conj) in vrne tak map. Oz. zadeve lahko poljubno sestavljaš in šele na koncu rečeš ok, to bom zdaj uporabil nad seznami. No v bistvu je transducer malo bolj zakompliciran (več funkcij) zaradi raznih corner-casov, ampak sama ideja je pomoje uporaba funkcijskih paradigm nad "čemerkoli".
V "čistih" jezikih tipa Haskell je vse skupaj precej brezveze. Prvič zaradi lenobe, ki ti omogoča, da imaš neskončen seznam in torej niti ne rabiš streamov. Drugič pa zaradi tega, ker map lahko narediš na poljubnem funktorju oz. fold nad Foldable. V npr. Clojure (ali Scali) si pa predstavljam, da je vse skupaj uporabno, ker si želiš interoperabilnosti z obstoječo Java kodo in knjižnicami.
Back on topic, za branje priporočam:
http://learnyouahaskell.com/
http://learnyousomeerlang.com/
Map vzame neko funkcijo in jo izvede po vseh elementih seznama. Ampak "težava" je v tem, da je vhod in izhod seznam in tako se mora tudi map zavedati, kako sestavljati seznam. Mapping je kolikor razumem samo funkcija, ki dobi kot parameter tudi način kako sestavljati elemente (privzeto conj) in vrne tak map. Oz. zadeve lahko poljubno sestavljaš in šele na koncu rečeš ok, to bom zdaj uporabil nad seznami. No v bistvu je transducer malo bolj zakompliciran (več funkcij) zaradi raznih corner-casov, ampak sama ideja je pomoje uporaba funkcijskih paradigm nad "čemerkoli".
V "čistih" jezikih tipa Haskell je vse skupaj precej brezveze. Prvič zaradi lenobe, ki ti omogoča, da imaš neskončen seznam in torej niti ne rabiš streamov. Drugič pa zaradi tega, ker map lahko narediš na poljubnem funktorju oz. fold nad Foldable. V npr. Clojure (ali Scali) si pa predstavljam, da je vse skupaj uporabno, ker si želiš interoperabilnosti z obstoječo Java kodo in knjižnicami.
Back on topic, za branje priporočam:
http://learnyouahaskell.com/
http://learnyousomeerlang.com/
ZaphodBB ::
Sem pogledal video o transducerjih pa moram rečt, da gre za zanimiv koncept, ne razumem pa, zakaj tak hype okoli tega. Meni izgleda vse skupaj kot posplošitev osnovnih gradnikov funkcijskega programiranja (map, fold, filter).
Saj ni nobenega hypa, samo zanimivo je - kar priznaš tudi sam. In točno tako, gre za (še eno) posplošitev.
"Naši dedje so se borili za to, da lahko odločamo
o lastni usodi - ne o usodi drugih ljudi." -jype
o lastni usodi - ne o usodi drugih ljudi." -jype
technolog ::
Ne, @fiction, v scali ni uporabno, ker imaš hierarhijo podatkovnih struktur. Naprimer vse podatkovne strukture, po katerih se lahko zapelješ, recimo List, Vector, Map, itd. extendajo Traversable, ... Če boš napisal transformacijo po Seq podatkovnem tipu, bo delovala po vseh zaporedjih.
Tako da so teli transducerji bolj muha programskega jezika Clojure (in verjetno še kakšnega) in zato nevredni, da bi zasedali prostor v mojih možganih. Hell, še wikipedija nima članka o njih.
Tako da so teli transducerji bolj muha programskega jezika Clojure (in verjetno še kakšnega) in zato nevredni, da bi zasedali prostor v mojih možganih. Hell, še wikipedija nima članka o njih.
ZaphodBB ::
Ne, @fiction, v scali ni uporabno, ker imaš hierarhijo podatkovnih struktur. Naprimer vse podatkovne strukture, po katerih se lahko zapelješ, recimo List, Vector, Map, itd. extendajo Traversable, ...
Tako da so teli transducerji bolj muha programskega jezika Clojure (in verjetno še kakšnega) in zato nevredni, da bi zasedali prostor v mojih možganih. Hell, še wikipedija nima članka o njih.
Zanimivo, daj mi razloži kakšno vezo ima to s transformacijami, ki jih napišeš enkrat in so uporabne na vsaki sekvenčni podatkovni strukturi? In ali Scala poskrbi, da se ti morebitne zaporedne operacije map/filter/whatever izvedejo v enem sprehodu skozi podatkovno strukturo?
"Naši dedje so se borili za to, da lahko odločamo
o lastni usodi - ne o usodi drugih ljudi." -jype
o lastni usodi - ne o usodi drugih ljudi." -jype
technolog ::
def transform(a: Traversable[Int]) = a.filter(...).map(..).reduce(...)
transform(List(1, 2, 3))
transform(Vector(1,2,3))
transform(Map(1 -> "a", 2 -> "b").keys)
Če hočeš, da se izvedejo v enem sprehodu čez strukturo, enostavno uporabiš .view, .iterator ali pa .toStream.
Pač sprijazni se, da je to neka specifika jezika Clojure raje kot nekaj, kar bi bilo univerzalno uporabno, kot recimo monada, funktor, itd...
transform(List(1, 2, 3))
transform(Vector(1,2,3))
transform(Map(1 -> "a", 2 -> "b").keys)
Če hočeš, da se izvedejo v enem sprehodu čez strukturo, enostavno uporabiš .view, .iterator ali pa .toStream.
Pač sprijazni se, da je to neka specifika jezika Clojure raje kot nekaj, kar bi bilo univerzalno uporabno, kot recimo monada, funktor, itd...
ZaphodBB ::
Pač sprijazni se, da je to neka specifika jezika Clojure raje kot nekaj, kar bi bilo univerzalno uporabno, kot recimo monada, funktor, itd...
Saj ti ni treba bit tako aroganten, mogoče pa tudi ti ne veš vsega. Transducerji so definitivno uporabni v JavaScriptu, še performančno se lepo obnašajo. Pa s tem nočem rečt, da ne obstajajo druge ekvivalentne tehnike. Samo, da jaz do danes nisem nobene poznal. Če ti veš kako drugo bom pa zelo vesel reference.
Edit: Tukaj trdijo, da zadeve niso čisto ekvivalentne. Jaz se ne bom opredeljeval, ker nimam ustreznega ozadja. Samo v vednost, mogoče pa ti lahko osvetliš zadevo.
"Naši dedje so se borili za to, da lahko odločamo
o lastni usodi - ne o usodi drugih ljudi." -jype
o lastni usodi - ne o usodi drugih ljudi." -jype
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Splošni pojmi iz programskih jezikovOddelek: Programiranje | 3783 (2435) | AndrejO |
» | Nadgradnja znanja v programiranju - kaj, kakoOddelek: Programiranje | 3636 (1682) | 2f4u |
» | Programiranje: FRI - rač. in informatika UNI ali Multimedija UNIOddelek: Programiranje | 5173 (4721) | Praskalec |
» | Kaj, kako se učiti?Oddelek: Programiranje | 2593 (2069) | napsy |