Rust vs. C++ (funkcionální vs. OOP)

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #45 kdy: 13. 03. 2016, 20:20:49 »
Akorát že FP je abstraktnější a málokdo chápe formální aparát za ním.
To ani není nutný. Pro běžný použití stačí znát jazyk a chápat, že primární věc jsou data a že ta data jsou neměnná.


andy

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #46 kdy: 13. 03. 2016, 20:23:19 »
Akorát že FP je abstraktnější a málokdo chápe formální aparát za ním.
Což ale není překážka v tom programovat. Obdivuju lidi, kteří to celé jsou schopni formálně popsat a využívat - ale vůbec není problém se na to dívat prakticky a chápat to taky.

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #47 kdy: 13. 03. 2016, 20:24:52 »
To zní zajímavě, ale pokud podívám na dnešní vývoj, tak tomu moc zapravdu nedává. V čem myslíš, že to je?
Vývoj čeho? Programovacích jazyků? Tam právě posun tímhle směrem je.

Ale jinak vím, že kočku i psa lze drbat, ale to mě samozřejmě u abstrakce tolik nebere jako třeba to, že jsou to v podstatě stejná zvířata. Detaily můžu mít pak v každé třídě, ne? Mně to přijde úplně normální. Mám auto a taky neřešim, jestli je sešroubavané a nebo z kovu, protože mě to až tak u auta nezajímá, ne?
Tak samozřejmě máš rozhraní/protokoly, které slučují věci, které tě zajímají. Jako třeba SaveableToXml a DrawableToPng. Důležitý je, že tahle rozhraní můžeš libovolně kombinovat, aniž bys z nich musel vytvářet hierarchii.

Radek Miček

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #48 kdy: 13. 03. 2016, 20:31:14 »
Rust neznám, ale třeba tohle je docela hezký článek na téma dědičnost vs. haskell nebo elm.

https://github.com/Dobiasd/articles/blob/master/from_oop_to_fp_-_inheritance_and_the_expression_problem.md

Drobná vada je, že ten článek neukazuje, jak udělat dědičnost v Haskellu. Zejména neukazuje, jak vyřešit problém s typem this (je to argument a je kovariantní - což obyčejně nejde). Dále neukazuje otevřenou rekurzi.

andy

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #49 kdy: 13. 03. 2016, 20:42:18 »
Rust neznám, ale třeba tohle je docela hezký článek na téma dědičnost vs. haskell nebo elm.

https://github.com/Dobiasd/articles/blob/master/from_oop_to_fp_-_inheritance_and_the_expression_problem.md

Drobná vada je, že ten článek neukazuje, jak udělat dědičnost v Haskellu. Zejména neukazuje, jak vyřešit problém s typem this (je to argument a je kovariantní - což obyčejně nejde). Dále neukazuje otevřenou rekurzi.
Ano, ten článek totiž přesně ukazuje, že pokud se na některé problému podíváme "jinak", tak z ničeho nic "this" nepotřebujeme. Což neznamená, že nikdy "this" nepotřebujeme - potom nám fakt nic jiného než OOP třeba nezbyde - ale velmi často stačí jiný pohled a najednou fakt, že tohle v haskellu nejde, není problém (ono přes Existentials to myslím plus minus jde, ale není to moc košer).


zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #50 kdy: 13. 03. 2016, 21:16:19 »
Akorát že FP je abstraktnější a málokdo chápe formální aparát za ním.
Což ale není překážka v tom programovat. Obdivuju lidi, kteří to celé jsou schopni formálně popsat a využívat - ale vůbec není problém se na to dívat prakticky a chápat to taky.
To většinou platí, ale je lepší chápat to do hloubky.

Radek Miček

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #51 kdy: 13. 03. 2016, 21:42:16 »
Rust neznám, ale třeba tohle je docela hezký článek na téma dědičnost vs. haskell nebo elm.

https://github.com/Dobiasd/articles/blob/master/from_oop_to_fp_-_inheritance_and_the_expression_problem.md

Drobná vada je, že ten článek neukazuje, jak udělat dědičnost v Haskellu. Zejména neukazuje, jak vyřešit problém s typem this (je to argument a je kovariantní - což obyčejně nejde). Dále neukazuje otevřenou rekurzi.
Ano, ten článek totiž přesně ukazuje, že pokud se na některé problému podíváme "jinak", tak z ničeho nic "this" nepotřebujeme.

Spíš mi přijde, že si autor vybral velmi jednoduchý příklad, čímž se těmto problémům vyhnul, než že by je vyřešil. Zajímavější by bylo, kdyby potomek nějaké metody zdědil (včetně implementace) od předka a byla tam i otevřená rekurze (tj. volání abstraktní metody, která bude definována až v podtřídě).

Inkvizitor

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #52 kdy: 13. 03. 2016, 22:23:40 »
Spíš mi přijde, že si autor vybral velmi jednoduchý příklad, čímž se těmto problémům vyhnul, než že by je vyřešil. Zajímavější by bylo, kdyby potomek nějaké metody zdědil (včetně implementace) od předka a byla tam i otevřená rekurze (tj. volání abstraktní metody, která bude definována až v podtřídě).

Otázka zní, proč by to měl někdo zkoušet takto naimplementovat. OOP řeší v konkrétní aplikaci nějaký konkrétní problém. Pokud chceme přepsat v nějakém jiném jazyce tu samou aplikaci, bylo by logičtější se zeptat, jaký problém daná konstrukce v původní implementaci řeší a pak hledat idiom, který ten problém řeší v tom "novém" jazyce, ne?

andy

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #53 kdy: 13. 03. 2016, 22:27:39 »
Akorát že FP je abstraktnější a málokdo chápe formální aparát za ním.
Což ale není překážka v tom programovat. Obdivuju lidi, kteří to celé jsou schopni formálně popsat a využívat - ale vůbec není problém se na to dívat prakticky a chápat to taky.
To většinou platí, ale je lepší chápat to do hloubky.
Pokud nehodláš psát další Lens knihovnu nebo implementovat nějakou TypeInType extension v GHC, tak bych řek, že je to úplně jedno.

Radek Miček

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #54 kdy: 13. 03. 2016, 22:53:49 »
Spíš mi přijde, že si autor vybral velmi jednoduchý příklad, čímž se těmto problémům vyhnul, než že by je vyřešil. Zajímavější by bylo, kdyby potomek nějaké metody zdědil (včetně implementace) od předka a byla tam i otevřená rekurze (tj. volání abstraktní metody, která bude definována až v podtřídě).

Otázka zní, proč by to měl někdo zkoušet takto naimplementovat.

Protože podle titulku se článek zabývá dědičností - tj. čekal bych příklad s dědičností, jenže příklad v článku žádnou dědičnost nepotřebuje (potřebuje určitou formu podtypového polymorfismu, ale ne dědičnost).

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #55 kdy: 13. 03. 2016, 23:06:17 »
Akorát že FP je abstraktnější a málokdo chápe formální aparát za ním.
Což ale není překážka v tom programovat. Obdivuju lidi, kteří to celé jsou schopni formálně popsat a využívat - ale vůbec není problém se na to dívat prakticky a chápat to taky.
To většinou platí, ale je lepší chápat to do hloubky.
Pokud nehodláš psát další Lens knihovnu nebo implementovat nějakou TypeInType extension v GHC, tak bych řek, že je to úplně jedno.
Takový přístup odlišuje profíka od patlala.

andy

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #56 kdy: 13. 03. 2016, 23:44:18 »

Protože podle titulku se článek zabývá dědičností - tj. čekal bych příklad s dědičností, jenže příklad v článku žádnou dědičnost nepotřebuje (potřebuje určitou formu podtypového polymorfismu, ale ne dědičnost).
Ne, podle titulku autor potřebuje implementovat nějaké UI rozhraní, které má v současné době implementované formou dědičnosti. Otázka zní, zda je dědičnost opravdu nutná pro implementaci toho, co autor potřebuje, nebo se to dá řešit nějak jinak. Konkrétně psal:
Citace
Evidentně dědičnost nějak rozumně nahradit nejde a jestli ano, tak za cenu flexibility => ve výsledku nemá cenu na něco se složitým datovým modelem používat funkcionální jazyk tohohle typu. Souhlasíte?
A moje odpověď je, že to dost záleží - dědičnost typicky není jediná možnost, jak něco implementovat, jiný pohled na problém často vede k diamtrálně jinému řešení, které vůbec nemusí být méně flexibilní. Ale je potřeba se na to podívat úplně jinak, způsoby řešení typické pro OOP jsou v FP spíše anti-pattern.

andy

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #57 kdy: 13. 03. 2016, 23:48:41 »
Pokud nehodláš psát další Lens knihovnu nebo implementovat nějakou TypeInType extension v GHC, tak bych řek, že je to úplně jedno.
Takový přístup odlišuje profíka od patlala.
Hádám, že máš category theory v malíčku, viď?

Inkvizitor

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #58 kdy: 13. 03. 2016, 23:55:21 »
Otázka zní, proč by to měl někdo zkoušet takto naimplementovat.

Protože podle titulku se článek zabývá dědičností - tj. čekal bych příklad s dědičností, jenže příklad v článku žádnou dědičnost nepotřebuje (potřebuje určitou formu podtypového polymorfismu, ale ne dědičnost).

Spíš se primárně zabývá "expression problemem" a vychází z C++ a jeho typicky OOP přístupu.

Radek Miček

Re:Rust vs. C++ (funkcionální vs. OOP)
« Odpověď #59 kdy: 14. 03. 2016, 00:08:59 »

Protože podle titulku se článek zabývá dědičností - tj. čekal bych příklad s dědičností, jenže příklad v článku žádnou dědičnost nepotřebuje (potřebuje určitou formu podtypového polymorfismu, ale ne dědičnost).
Ne, podle titulku autor potřebuje implementovat nějaké UI rozhraní, které má v současné době implementované formou dědičnosti. Otázka zní, zda je dědičnost opravdu nutná pro implementaci toho, co autor potřebuje, nebo se to dá řešit nějak jinak. Konkrétně psal:
Citace
Evidentně dědičnost nějak rozumně nahradit nejde a jestli ano, tak za cenu flexibility => ve výsledku nemá cenu na něco se složitým datovým modelem používat funkcionální jazyk tohohle typu. Souhlasíte?
A moje odpověď je, že to dost záleží - dědičnost typicky není jediná možnost, jak něco implementovat, jiný pohled na problém často vede k diamtrálně jinému řešení, které vůbec nemusí být méně flexibilní. Ale je potřeba se na to podívat úplně jinak, způsoby řešení typické pro OOP jsou v FP spíše anti-pattern.

Myslel jsem titulek vámi odkazovaného článku, nikoliv titulek této diskuze.