Monad transformer v Pythonu

JS

Re:Monad transformer v Pythonu
« Odpověď #15 kdy: 27. 07. 2018, 18:00:34 »
To je blábol, nadtřída klidně může prostě zavolat konstruktor, který může být polymorfní a fungovat jako unit. Radši ten transformer nepiš, ať do toho nevnášíš bordel.

"Muze." Rozmysli si znova moji otazku - jak pak vytvoris instanci Nothing?

Ano, konstruktor muze fungovat jako unit, ale ne tak, jak je napsan v tride Maybe. Musel by dostat specialni parametr, ktery rika, jestli chces vytvorit instanci Nothing. A ten specialni parametr by musela nadtrida respektovat, coz je prinejmensim nepekne.


Géomètre

Re:Monad transformer v Pythonu
« Odpověď #16 kdy: 27. 07. 2018, 18:05:16 »
nadtřída klidně může prostě zavolat konstruktor, který může být polymorfní a fungovat jako unit.
ten specialni parametr by musela nadtrida respektovat, coz je prinejmensim nepekne.
Nemusela protože polymorfismus. Jsou i jiné praktické důvody, proč mít konstruktor pro unit. Nicméně talk is cheap, show me the code.

JS

Re:Monad transformer v Pythonu
« Odpověď #17 kdy: 27. 07. 2018, 18:12:47 »
A je trochu zavadejici nazyvat operaci "pure" (nebo "return", jak je to v Haskellu spis historicky) jako "unit". Plete se to pak u monad, ktere se navic chovaji i jako monoid.

Nemusela protože polymorfismus. Jsou i jiné praktické důvody, proč mít konstruktor pro unit. Nicméně talk is cheap, show me the code.

Nevim, jak ti mohu ukazat kod, kdyz tvrdim, ze to co chces nejde dohromady s danou definici Maybe, jak byla zde predlozena. Naopak, ty bys mel ukazat kod, kdyz tvrdis, ze to mozne je.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #18 kdy: 27. 07. 2018, 19:27:40 »
A je trochu zavadejici nazyvat operaci "pure" (nebo "return", jak je to v Haskellu spis historicky) jako "unit". Plete se to pak u monad, ktere se navic chovaji i jako monoid.
O monády tu celou dobu jde a původní terminologie je unit (že si haskellisti a jiní vymysleli pure, return, flatmap apod. je irelevantní). A komu chování jako monoid, nebude to tím, že to je monoid? A k tomu kódu, genetický unit v nadtřídě vrací prostě self(arg), naprosto triviálně. To funguje i s tou třídou výše. Pro transformer to je ovšem k ničemu.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #19 kdy: 27. 07. 2018, 20:09:51 »
Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.
Pleteš, ta rovnost neplatí.
Muzes to lepe vysvetlit?
Tohle nějak zapadlo. Tam není rovnost, jen isomorfismus. X se taky nerovná Xx1 nebo X+0, i když je s nimi isomorfní.


Géomètre

Re:Monad transformer v Pythonu
« Odpověď #20 kdy: 27. 07. 2018, 20:14:19 »
monada bude jenom neformalne definovane rozhrani (tj. trida ktera ma urcite metody).
Monáda je regulérní nadtřída, jak jinak bys dostal fmap a join, když implementuješ jen unit a bind? Pro MF doporučuju začít s liftem, ten je nejjednodušší a automaticky dá unit.

JS

Re:Monad transformer v Pythonu
« Odpověď #21 kdy: 28. 07. 2018, 11:32:21 »
To je zase srazka s autistou, jednou.. Co kdybys radeji misto vrtani se v definicich tazateli pomohl, kdyz nechces, abych to udelal ja?

Samozrejme, kazda monada je monoid. Ale prakticke monady v programovani (treba Maybe nebo List) jsou casto monoidy jeste v jinem smyslu, a pak se to unit plete. Proto taky vynalezli jinou terminologii.

Izomorfismus nebudu komentovat, to je cisty matematicky autismus. Monadu je asi pravda v Pythonu praktictejsi implementovat jako tridu nez jako interface (uz jsem pozapomnel, proc jsem z Pythonu presel k Haskellu, kde tyhle triviality nemusim resit), nicmene to nijak neresi problem, ze jsme zatim z tazatele nedostali jeji definici, natoz definici Maybe.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #22 kdy: 28. 07. 2018, 12:26:23 »
Samozrejme, kazda monada je monoid. Ale prakticke monady v programovani (treba Maybe nebo List) jsou casto monoidy jeste v jinem smyslu, a pak se to unit plete. Proto taky vynalezli jinou terminologii.

nedostali jeji definici, natoz definici Maybe.
Že se to tobě plete neznamená, že se to plete ostatním. Když neznáš ani základní definice, tak se nediv, že v tom máš guláš.

Kdyby ses trochu zamyslel, dojde ti, co v té nadtřídě je (to Maybe je správně a nejjednodušší možné).

A zkus méně ad hominem a víc relevantního obsahu.

Trader

Re:Monad transformer v Pythonu
« Odpověď #23 kdy: 08. 08. 2018, 20:56:23 »
pythonu jsem už trochu odvyknul, ale nešlo by použít metaclasses pro vytvoření typu (třídy) transformované monády?
Nešlo. Místo class MaybeT: tam má být def MaybeT: vracející anonymní třídu. Takto se to dělá v JS a v Pythonu to funguje úplně stejně (a je to nejelegantnější a zároveň idiomatické řešení).

smrad

Re:Monad transformer v Pythonu
« Odpověď #24 kdy: 08. 08. 2018, 21:28:11 »
Hosi, ty vase plky kolem pseudofunkcionalniho programovani jsou desne k smichu, zvlaste kdyz to z toho co pisete vubec neumite.

Trader

Re:Monad transformer v Pythonu
« Odpověď #25 kdy: 08. 08. 2018, 22:43:13 »
Místo class MaybeT: tam má být def MaybeT: vracející anonymní třídu.
Abych to upřesnil:
Kód: [Vybrat]
def MaybeT(M):
    class MT(Monad):
        ...
    return MT
 
V podstatě jde o lexikální uzávěr, akorát (meta)typu třída. Lépe to nejde.

Ivan Nový

Re:Monad transformer v Pythonu
« Odpověď #26 kdy: 08. 08. 2018, 23:06:33 »
To je blábol, nadtřída klidně může prostě zavolat konstruktor, který může být polymorfní a fungovat jako unit. Radši ten transformer nepiš, ať do toho nevnášíš bordel.

"Muze." Rozmysli si znova moji otazku - jak pak vytvoris instanci Nothing?

Ano, konstruktor muze fungovat jako unit, ale ne tak, jak je napsan v tride Maybe. Musel by dostat specialni parametr, ktery rika, jestli chces vytvorit instanci Nothing. A ten specialni parametr by musela nadtrida respektovat, coz je prinejmensim nepekne.
V Pythonu můžete místo __init__ použít __new__ a tam si můžete vrátit co chcete, jakýkoliv objekt, který vytvoříte z parametrů.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #27 kdy: 09. 08. 2018, 12:36:22 »
To je blábol, nadtřída klidně může prostě zavolat konstruktor, který může být polymorfní a fungovat jako unit. Radši ten transformer nepiš, ať do toho nevnášíš bordel.

"Muze." Rozmysli si znova moji otazku - jak pak vytvoris instanci Nothing?

Ano, konstruktor muze fungovat jako unit, ale ne tak, jak je napsan v tride Maybe. Musel by dostat specialni parametr, ktery rika, jestli chces vytvorit instanci Nothing. A ten specialni parametr by musela nadtrida respektovat, coz je prinejmensim nepekne.
V Pythonu můžete místo __init__ použít __new__ a tam si můžete vrátit co chcete, jakýkoliv objekt, který vytvoříte z parametrů.
__new__ nesouvisí s výše zmíněným “neproblémem” (poskytnutý kód byl v pořádku).