Monad transformer v Pythonu

Vykladač

Monad transformer v Pythonu
« kdy: 25. 07. 2018, 16:21:59 »
Ahoj, nevíte, jak udělat generický monad transformer v Pythonu? Mám

Kód: [Vybrat]
class MaybeT:
    def __init__(self, M):
        self.M = M

a rád bych vytvořil obecnou monádu, ale neumím to genericky, tj. bez odkazování na typ zabalené monády (např. List nebo Cont). Jde to vůbec (vzhledem k tomu, že jde o higher-kinded type, což Python nijak zvlášť nepodporuje)?


v

Re:Monad transformer v Pythonu
« Odpověď #1 kdy: 25. 07. 2018, 19:55:58 »
pythonu jsem už trochu odvyknul, ale nešlo by použít metaclasses pro vytvoření typu (třídy) transformované monády?

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #2 kdy: 25. 07. 2018, 20:56:01 »
pythonu jsem už trochu odvyknul, ale nešlo by použít metaclasses pro vytvoření typu (třídy) transformované monády?
Jde to i bez metatříd.

JS

Re:Monad transformer v Pythonu
« Odpověď #3 kdy: 26. 07. 2018, 08:33:35 »
Kdyz mi das svoji definici Maybe tak ti to muzu zkusit napsat. Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.

Samozrejme, jelikoz Monad v Haskellu je typova trida, a jsi v Pythonu, tak monada bude jenom neformalne definovane rozhrani (tj. trida ktera ma urcite metody).

Vykladač

Re:Monad transformer v Pythonu
« Odpověď #4 kdy: 26. 07. 2018, 11:24:53 »
Kdyz mi das svoji definici Maybe tak ti to muzu zkusit napsat. Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.
Maybe mám klasicky:
Kód: [Vybrat]
class Maybe(Monad):
    def __init__(self, val):
        self.val = val
    def bind(self, func):
        if self.val is None:
            return None
        else:
            return func(self.val)
Chtěl bych použít MaybeT(List) (například) a výsledek pak klasicky jako jakoukoliv monádu. Klidně i přes ty metatřídy, co jsem koukal, jsou to v podstatě "třídy" dědící z type.


v

Re:Monad transformer v Pythonu
« Odpověď #5 kdy: 26. 07. 2018, 11:39:02 »
Kdyz mi das svoji definici Maybe tak ti to muzu zkusit napsat. Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.
Maybe mám klasicky:
Kód: [Vybrat]
class Maybe(Monad):
    def __init__(self, val):
        self.val = val
    def bind(self, func):
        if self.val is None:
            return None
        else:
            return func(self.val)
Chtěl bych použít MaybeT(List) (například) a výsledek pak klasicky jako jakoukoliv monádu. Klidně i přes ty metatřídy, co jsem koukal, jsou to v podstatě "třídy" dědící z type.
to "return None" se mi moc nezdá

Vykladač

Re:Monad transformer v Pythonu
« Odpověď #6 kdy: 26. 07. 2018, 12:11:01 »
Kdyz mi das svoji definici Maybe tak ti to muzu zkusit napsat. Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.
Maybe mám klasicky:
Kód: [Vybrat]
class Maybe(Monad):
    def __init__(self, val):
        self.val = val
    def bind(self, func):
        if self.val is None:
            return None
        else:
            return func(self.val)
Chtěl bych použít MaybeT(List) (například) a výsledek pak klasicky jako jakoukoliv monádu. Klidně i přes ty metatřídy, co jsem koukal, jsou to v podstatě "třídy" dědící z type.
to "return None" se mi moc nezdá
Jo, to je blbost, jak jsem to přepisoval z typovaného jazyka s implicitní konverzí. Nicméně na transformery to nemá vliv.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #7 kdy: 26. 07. 2018, 13:05:12 »
Kdyz mi das svoji definici Maybe tak ti to muzu zkusit napsat. Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.
Maybe mám klasicky:
Kód: [Vybrat]
class Maybe(Monad):
    def __init__(self, val):
        self.val = val
    def bind(self, func):
        if self.val is None:
            return None
        else:
            return func(self.val)
Chtěl bych použít MaybeT(List) (například) a výsledek pak klasicky jako jakoukoliv monádu. Klidně i přes ty metatřídy, co jsem koukal, jsou to v podstatě "třídy" dědící z type.
Lepší by to bylo přes operátor konflace (TypTyp)2TypTyp.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #8 kdy: 27. 07. 2018, 11:34:57 »
Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.
Pleteš, ta rovnost neplatí.

JS

Re:Monad transformer v Pythonu
« Odpověď #9 kdy: 27. 07. 2018, 14:47:08 »
Vysel bych z toho, ze (pokud se nepletu) MaybeT Id = Maybe.
Pleteš, ta rovnost neplatí.

Muzes to lepe vysvetlit? Tim Id myslim Identity monadu, viz http://hackage.haskell.org/package/mtl-2.2.2/docs/Control-Monad-Identity.html: "The purpose of the Identity monad is its fundamental role in the theory of monad transformers. Any monad transformer applied to the Identity monad yields a non-transformer version of that monad."

Citace
Jo, to je blbost, jak jsem to přepisoval z typovaného jazyka s implicitní konverzí. Nicméně na transformery to nemá vliv.

Proto jsem se ptal na to Maybe.. pokud tazatel neumi napsat Maybe (porad tam jeste chybi definice pure), mel by si nejdriv zkusit napsat tu, a pak teprve se poustet do transformeru.

Ja sam transformery moc neznam, ale jak jsem psal - kdyz mi ukazes, ze umis napsat normalni Maybe, tak ti muzu zkusit napsat MaybeT.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #10 kdy: 27. 07. 2018, 16:19:47 »
porad tam jeste chybi definice pure
To mají aplikativní funktory, myslíš unit? To tam přece je. Jen se to tak nejmenuje.

JS

Re:Monad transformer v Pythonu
« Odpověď #11 kdy: 27. 07. 2018, 16:40:57 »
porad tam jeste chybi definice pure
To mají aplikativní funktory, myslíš unit? To tam přece je. Jen se to tak nejmenuje.

Ano, myslim implementaci pure nebo return.

Ale jestli myslis, ze to dela konstruktor, tak je to zase spatne.. Jak zkonstruujes instanci Nothing? Ja ten konstruktor beru jako datovy konstruktor pro typ Maybe, tedy Nothing | Just a, jenze pure vraci jenom Just a.

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #12 kdy: 27. 07. 2018, 16:57:28 »
porad tam jeste chybi definice pure
To mají aplikativní funktory, myslíš unit? To tam přece je. Jen se to tak nejmenuje.
Ale jestli myslis, ze to dela konstruktor, tak je to zase spatne.. Jak zkonstruujes instanci Nothing? Ja ten konstruktor beru jako datovy konstruktor pro typ Maybe, tedy Nothing | Just a, jenze pure vraci jenom Just a.
To snad dělá ta nadtřída, ne? Ta by měla mít i svůj bind, fmap a join. Trochu si ujasni, co to monáda vlastně je. Ten transformer pak přijde sám.

JS

Re:Monad transformer v Pythonu
« Odpověď #13 kdy: 27. 07. 2018, 17:26:18 »
porad tam jeste chybi definice pure
To mají aplikativní funktory, myslíš unit? To tam přece je. Jen se to tak nejmenuje.
Ale jestli myslis, ze to dela konstruktor, tak je to zase spatne.. Jak zkonstruujes instanci Nothing? Ja ten konstruktor beru jako datovy konstruktor pro typ Maybe, tedy Nothing | Just a, jenze pure vraci jenom Just a.
To snad dělá ta nadtřída, ne? Ta by měla mít i svůj bind, fmap a join. Trochu si ujasni, co to monáda vlastně je. Ten transformer pak přijde sám.

Dela? Opravdu? Jak to vis, kdyz nezname jeji definici?

Ja jsem chtel tazateli pomoct, ale nejdriv musi napsat, jak ma definovanou Maybe monadu. Protoze je mnoho moznosti, jak to udelat. Ty misto toho jen rozdavas rozumy, a jeste spatne (jelikoz pure nevraci nikdy Nothing, tak nemuze byt definovana v Monad, ale musi byt definovana v Maybe, protoze co je Nothing je taky definovano v Maybe).

Géomètre

Re:Monad transformer v Pythonu
« Odpověď #14 kdy: 27. 07. 2018, 17:30:08 »
porad tam jeste chybi definice pure
To mají aplikativní funktory, myslíš unit? To tam přece je. Jen se to tak nejmenuje.
Ale jestli myslis, ze to dela konstruktor, tak je to zase spatne.. Jak zkonstruujes instanci Nothing? Ja ten konstruktor beru jako datovy konstruktor pro typ Maybe, tedy Nothing | Just a, jenze pure vraci jenom Just a.
To snad dělá ta nadtřída, ne? Ta by měla mít i svůj bind, fmap a join. Trochu si ujasni, co to monáda vlastně je. Ten transformer pak přijde sám.
jelikoz pure nevraci nikdy Nothing, tak nemuze byt definovana v Monad
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.