Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: CxxDaemon 09. 05. 2017, 12:12:37

Název: Funktory v C++
Přispěvatel: CxxDaemon 09. 05. 2017, 12:12:37
V knize o metaprogramování v C++ píšou, že něco jako "template<typename T> class C" je "funktor", ovšem bez nějakého bližšího kontextu. Může mi někdo polopatisticky vysvětlit, co to je funktor a jak to je relevantní pro C++?
Název: Re:Funktory v C++
Přispěvatel: hu 09. 05. 2017, 12:30:50
V knize o metaprogramování v C++ píšou, že něco jako "template<typename T> class C" je "funktor", ovšem bez nějakého bližšího kontextu. Může mi někdo polopatisticky vysvětlit, co to je funktor a jak to je relevantní pro C++?

https://en.wikipedia.org/wiki/Function_object
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 12:47:33
V knize o metaprogramování v C++ píšou, že něco jako "template<typename T> class C" je "funktor", ovšem bez nějakého bližšího kontextu. Může mi někdo polopatisticky vysvětlit, co to je funktor a jak to je relevantní pro C++?

https://en.wikipedia.org/wiki/Function_object
Chyba, to je něco úplně jiného. Je propastný rozdíl mezi volatelným objektem (std::function) a funktorem v kategorii typů nějakého jazyka (zdejší případ v kontextu generického programování).
Název: Re:Funktory v C++
Přispěvatel: lopata 09. 05. 2017, 12:54:57
Chyba, to je něco úplně jiného. Je propastný rozdíl mezi volatelným objektem (std::function) a funktorem v kategorii typů nějakého jazyka (zdejší případ v kontextu generického programování).

Bohužel sis nepřečetl zadání: Může mi někdo polopatisticky vysvětlit... Takže je tvoje odpověd zcela nerelevantní.
Název: Re:Funktory v C++
Přispěvatel: xavi 09. 05. 2017, 13:09:39
http://stackoverflow.com/questions/356950/c-functors-and-their-uses
Název: Re:Funktory v C++
Přispěvatel: expert 09. 05. 2017, 13:14:01
Kód: [Vybrat]
template<typename T> class C; /*< forward deklarace - neni funktor */

template<typename T> class C
{
public:
   /* definice funkce, stale se nejedna o funktor */
   void operator()
   {
      std::cout << "I'm functor" << std::endl;
   }   
};

C<int> c;  /*< c je functor */

c(); /* I'm functor */

Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 13:15:05
http://stackoverflow.com/questions/356950/c-functors-and-their-uses
Dtto, to je i jiných funktorech.
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 13:22:15
V knize o metaprogramování v C++ píšou, že něco jako "template<typename T> class C" je "funktor", ovšem bez nějakého bližšího kontextu. Může mi někdo polopatisticky vysvětlit, co to je funktor a jak to je relevantní pro C++?
Tyto "funktory" jsou v každém jazyce s generickými typy, až na to, že to nejsou funktory (podle definice), protože nefungují na morfismech, takže čistě formálně je to funkční restrikce funktoru pomíjející morfismy. A polopatě: "a functor is a function taking objects of a category to objects of another category". V jazycích jako C++, Java, Swift, Go apod. jde o kategorii typů. Čili třeba z int udělám C<int>, kde C je ten "funktor" přiřazující typu int onen složitější typ. Toť vše. S operátorem () to nijak nesouvisí, v Javě to je úplně stejné.
Název: Re:Funktory v C++
Přispěvatel: hu 09. 05. 2017, 13:23:30
V knize o metaprogramování v C++ píšou, že něco jako "template<typename T> class C" je "funktor", ovšem bez nějakého bližšího kontextu. Může mi někdo polopatisticky vysvětlit, co to je funktor a jak to je relevantní pro C++?

https://en.wikipedia.org/wiki/Function_object
Chyba, to je něco úplně jiného. Je propastný rozdíl mezi volatelným objektem (std::function) a funktorem v kategorii typů nějakého jazyka (zdejší případ v kontextu generického programování).

Máš samozřejme pravdu, moje culpa.
Název: Re:Funktory v C++
Přispěvatel: JSH 09. 05. 2017, 13:26:16
Pro lidi :

V C++ světě je funktor objekt s operátorem závorky, takže jde zavolat jako funkce.

V Haskell světě (i jinde, je to z teorie kategorií) je to "funkce" nad typy. vector<> je "funkce", která bere typ prvku a vrací specializovaný kontejner.
Název: Re:Funktory v C++
Přispěvatel: lopata 09. 05. 2017, 13:32:53
Pro lidi :

V C++ světě je funktor objekt s operátorem závorky, takže jde zavolat jako funkce.

V Haskell světě (i jinde, je to z teorie kategorií) je to "funkce" nad typy. vector<> je "funkce", která bere typ prvku a vrací specializovaný kontejner.

Přesně tak, v C++ se bežně termín funktor (zne)užívá pro funkční objekt. Můžeme s tím nesouhlasit, můžeme proti tomu protestovat, ale to je to jediné, co s tím můžeme dělat.

Pokud se chce někdo vrtat ve formálních rozdílech, teorii kategorí, monádách apod., tak zde: http://jackieokay.com/2017/01/26/functors.html
Název: Re:Funktory v C++
Přispěvatel: andy 09. 05. 2017, 14:04:18
Tak jsem myslel, že na to někdo odpoví "po lopatě" (to je totiž hezky česky)....

Po lopatě, funktor je kontejner, který má operaci pro práci s prvky, co jsou uvnitř, která splňuje nějaké základní náležitosti (aby se to dalo považovat za kontejner).

"template<typename T> class C" je schopné být funktor, protože ta funkce, která dělá něco s tím, co je uvnitř, může taky měnit ten typ.

Ta operace se jmenuje "fmap", vypadá jako "C<T2> fmap(f, C<T1>)" a "f" je "T2 f(T1)". Typická implementace je, že to pro každý prvek toho kontejneru zavolá tu funkci "f", prvek vymění za nový a vrátí výsledek (může se změnit typ). A aby to splňovalo tu představu "kontejneru", tak to musí splňovat, že
Kód: [Vybrat]
id(x) { return x; }
fmap(id, container) == container

sloz(x) { return p(q(x)) }
fmap(sloz, container) == fmap(p, fmap(q))
(C++ syntaxi pořádně neumim, tak je to trochu pseudo)

Třeba takový generický "seznam" je funktor - operace fmap se zavolá pro každý prvek a vrátí se výsledek. Optional je funktor - když v něm nic není, vrátí nic, jinak zavolá tu funkci a vrátí nový optional s jiným výsledkem. Hashmapa je funktor - fmap se volá na hodnoty. Funkce je funktor; fmap se zavolá na výsledek funkce (vlastně složení funkcí).

Jinak tady to je i s tou teorií i C++ příklady:
https://bartoszmilewski.com/2015/01/20/functors/ (https://bartoszmilewski.com/2015/01/20/functors/)
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 09. 05. 2017, 14:05:12
Bohužel sis nepřečetl zadání: Může mi někdo polopatisticky vysvětlit...
Pokud někdo chcete polopatistické vysvětlení toho "skutečného" funktoru, tak tohle je docela dobrý: http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 09. 05. 2017, 14:18:10
Po lopatě, funktor je kontejner, který má operaci pro práci s prvky
To je sice pěkně po lopatě, ale je to zavádějící. I funkce může být functor...
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 14:18:44
Tak jsem myslel, že na to někdo odpoví "po lopatě" (to je totiž hezky česky)....

Po lopatě, funktor je kontejner, který má operaci pro práci s prvky, co jsou uvnitř, která splňuje nějaké základní náležitosti (aby se to dalo považovat za kontejner).

"template<typename T> class C" je schopné být funktor, protože ta funkce, která dělá něco s tím, co je uvnitř, může taky měnit ten typ.

Ta operace se jmenuje "fmap", vypadá jako "C<T2> fmap(f, C<T1>)" a "f" je "T2 f(T1)". Typická implementace je, že to pro každý prvek toho kontejneru zavolá tu funkci "f", prvek vymění za nový a vrátí výsledek (může se změnit typ). A aby to splňovalo tu představu "kontejneru", tak to musí splňovat, že
Kód: [Vybrat]
id(x) { return x; }
fmap(id, container) == container

sloz(x) { return p(q(x)) }
fmap(sloz, container) == fmap(p, fmap(q))
(C++ syntaxi pořádně neumim, tak je to trochu pseudo)

Třeba takový generický "seznam" je funktor - operace fmap se zavolá pro každý prvek a vrátí se výsledek. Optional je funktor - když v něm nic není, vrátí nic, jinak zavolá tu funkci a vrátí nový optional s jiným výsledkem. Hashmapa je funktor - fmap se volá na hodnoty. Funkce je funktor; fmap se zavolá na výsledek funkce (vlastně složení funkcí).

Jinak tady to je i s tou teorií i C++ příklady:
https://bartoszmilewski.com/2015/01/20/functors/ (https://bartoszmilewski.com/2015/01/20/functors/)
Akorát to nemusí být kontejner.
Název: Re:Funktory v C++
Přispěvatel: andy 09. 05. 2017, 15:28:33
Po lopatě, funktor je kontejner, který má operaci pro práci s prvky
To je sice pěkně po lopatě, ale je to zavádějící. I funkce může být functor...
Ale to by nebylo po lopatě.... a hlavně jsem to psal:
Citace
Funkce je funktor; fmap se zavolá na výsledek funkce (vlastně složení funkcí).
A jak to, že funkce není kontejner? Je to normální kontejner indexovatelný parametrem!
Název: Re:Funktory v C++
Přispěvatel: Sten 09. 05. 2017, 15:42:15
A jak to, že funkce není kontejner? Je to normální kontejner indexovatelný parametrem!

Jakým parametrem je indexovatelná třeba funkce std::getline?

Funkce není kontejner. Funktor může a nemusí být kontejner a stejně tak kontejner může a nemusí být funktor, jsou to ortogonální charakteristiky.
Název: Re:Funktory v C++
Přispěvatel: Ondra Satai Nekola 09. 05. 2017, 16:01:38
A jak to, že funkce není kontejner? Je to normální kontejner indexovatelný parametrem!

Jakým parametrem je indexovatelná třeba funkce std::getline?

Funkce není kontejner. Funktor může a nemusí být kontejner a stejně tak kontejner může a nemusí být funktor, jsou to ortogonální charakteristiky.

No ona to neni z urciteho pohledu funkce ;)

Ale obecne souhlasim s tim, ze "funkce je kontejner" sice muze vest k AHA momentu, ale taky to muze veci dost zatemnit, dokud se neudela jasno v tom, v jakych mezich uvazujeme a co presne znamena nase terminologie.
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 16:45:52
A jak to, že funkce není kontejner? Je to normální kontejner indexovatelný parametrem!

Jakým parametrem je indexovatelná třeba funkce std::getline?

Funkce není kontejner. Funktor může a nemusí být kontejner a stejně tak kontejner může a nemusí být funktor, jsou to ortogonální charakteristiky.
On to dodrbal, oponoval jsem tvrzení, že FUNKTOR je kontejner, o funkci nebyla řeč. Navíc je otázka, co myslel "kontejnerem", protože kolekce v této souvislosti taky nedávají smysl. Funktor je prostě dvojice funkcí nad typy a morfismy, jedna část je typový konsturktor a druhá fmap.
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 09. 05. 2017, 17:07:00
A jak to, že funkce není kontejner? Je to normální kontejner indexovatelný parametrem!
No za prvé, pokud programátorovi v C++ řekneš, že funkce je kontejner, tak ho akorát tak zmateš.

Za druhé, pokud přijmeme takovou definici "kontejneru", že i funkce je kontejner, pak bude kontejner všechno a ten pojem ztratí smysl. Přitom v (ne-funkcionálním) programování ten pojem má smysl - je to "úložiště na hodnoty", nějaké místo v paměti, kam můžeš něco uložit. Zatímco funkce je nějaký kód, který můžeš spustit a on ti něco vygeneruje (případně na základě nějakých parametrů). V ne-funkcionálním programování tohle rozlišení má smysl a je zaužívané.

A za třetí, když už se mermomoci chceš posunovat k větší míře abstrakce, než je podle mě u "polopatického" vysvětlení vhodné, tak functor je především (jak psal zboj) homomorfismus mezi kategoriemi (což si můžeš přejmenovat na "kontejner", ale uděláš tím víc škody než užitku).
Název: Re:Funktory v C++
Přispěvatel: egyptan_skinuhead 09. 05. 2017, 17:54:52
V knize o metaprogramování v C++ píšou, že něco jako "template<typename T> class C" je "funktor", ovšem bez nějakého bližšího kontextu. Může mi někdo polopatisticky vysvětlit, co to je funktor a jak to je relevantní pro C++?

https://en.wikipedia.org/wiki/Function_object
Chyba, to je něco úplně jiného. Je propastný rozdíl mezi volatelným objektem (std::function) a funktorem v kategorii typů nějakého jazyka (zdejší případ v kontextu generického programování).

std::function není "volatelný objekt" (v nejpřesnějším slova smyslu), nýbrž wrapper. Může uchovávat member funkci - čili metodu, standardní funkci, lambda funkci a nebo funktor (v kontextu funkčního objektu, čili přetíženého operátoru ()).

Ještě bych zmínil, že dle definice Scotta Meyerse je C++ složeno z několika jazyků, podporující různá paradigmata:
1) Generické programování (templaty)
2) Metaprogramování (turing-complete templaty a programování s nimi "v době překladu")
3) Funkcionální programování (lambdy)
4) OOP (klasické C++, jak si ho většina lidí představí)
5) Procedurální ("C-čková" část C++)

Čili při diskuzi o různých pojmejch je nutné dodat i kontext. A to je to, co se tu, myslím, plete dohromady... Možná by dávalo větší smysl se o tomhle bavit v kontextu Haskellu a jeho bláznivého type-systému.
Název: Re:Funktory v C++
Přispěvatel: UF 09. 05. 2017, 18:05:59
panove - takhe tu vez nepostavite ani kdybyste se rozkrajeli!
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 18:08:59
V knize o metaprogramování v C++ píšou, že něco jako "template<typename T> class C" je "funktor", ovšem bez nějakého bližšího kontextu. Může mi někdo polopatisticky vysvětlit, co to je funktor a jak to je relevantní pro C++?

https://en.wikipedia.org/wiki/Function_object
Chyba, to je něco úplně jiného. Je propastný rozdíl mezi volatelným objektem (std::function) a funktorem v kategorii typů nějakého jazyka (zdejší případ v kontextu generického programování).

std::function není "volatelný objekt" [...] Může uchovávat member funkci - čili metodu, standardní funkci, lambda funkci a nebo funktor (v kontextu funkčního objektu, čili přetíženého operátoru ()).
Právě proto to je vždy volatelný objekt.
Název: Re:Funktory v C++
Přispěvatel: andy 09. 05. 2017, 19:43:43
No za prvé, pokud programátorovi v C++ řekneš, že funkce je kontejner, tak ho akorát tak zmateš.
Řekl bych, že ho zmatu mnohem míň, než, když napíšu:
Citace
... functor je především (jak psal zboj) homomorfismus mezi kategoriemi ...

Ono normálnímu C++ programátorovi vysvětlovat, že "funkce je funktor" by znamenalo nejdřív mu vysvětlit, co to je "funkce"... Takže bych řekl, že normální programátor se v klidu může spokojit s tím, že funktor je kontejner. A že funkce je funktor už je pak na další vysvětlování....
Název: Re:Funktory v C++
Přispěvatel: andy 09. 05. 2017, 19:45:00
A jak to, že funkce není kontejner? Je to normální kontejner indexovatelný parametrem!

Jakým parametrem je indexovatelná třeba funkce std::getline?
RealWorld#
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 20:03:04
No za prvé, pokud programátorovi v C++ řekneš, že funkce je kontejner, tak ho akorát tak zmateš.
Řekl bych, že ho zmatu mnohem míň, než, když napíšu:
Citace
... functor je především (jak psal zboj) homomorfismus mezi kategoriemi ...

Ono normálnímu C++ programátorovi vysvětlovat, že "funkce je funktor" by znamenalo nejdřív mu vysvětlit, co to je "funkce"... Takže bych řekl, že normální programátor se v klidu může spokojit s tím, že funktor je kontejner. A že funkce je funktor už je pak na další vysvětlování....
Funkce není funktor ve smyslu otázky ani s nimi nemá nic společného. Co píšeš nemá hlavu ani patu. Buď napiš něco smysluplného, nebo přiznej, že tomu ani za mák nerozumíš. MP ti to jistě rád vysvětlí, ostatně je zde asi tak jediný, co v teorii kategorií neplave.
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 09. 05. 2017, 20:03:20
Řekl bych, že ho zmatu mnohem míň, než, když napíšu:
Jasně, však jsem to říkal:
když už se mermomoci chceš posunovat k větší míře abstrakce, než je podle mě u "polopatického" vysvětlení vhodné

Ono normálnímu C++ programátorovi vysvětlovat, že "funkce je funktor" by znamenalo nejdřív mu vysvětlit, co to je "funkce"...
Ale on pojem funkce zná, akorát ho používá v jiném smyslu než ty, proto je to matoucí :)

Takže bych řekl, že normální programátor se v klidu může spokojit s tím, že funktor je kontejner.
Určitě, ale měl by vědět, že to je jenom (velmi dobrý) způsob, jak si to představit, ne že to "je ono".

Čili při diskuzi o různých pojmejch je nutné dodat i kontext. A to je to, co se tu, myslím, plete dohromady... Možná by dávalo větší smysl se o tomhle bavit v kontextu Haskellu a jeho bláznivého type-systému.
To není v kontextu Haskellu, ale v kontextu matematiky, konrétně teorie kategorií. Ta je jenom v Haskellu využita - a ty pojmy se tam používají (víceméně) v tom smyslu, jako v matematice. Že C++ použije ten samý pojem v úplně jiném smyslu, není problém matematiky ;)

...ale žádnej céčkař z toho nemusí být dotčenej, v Prologu je podobnej problém :) http://www.cse.unsw.edu.au/~billw/dictionaries/prolog/functor.html
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 09. 05. 2017, 20:04:45
ostatně je zde asi tak jediný, co v teorii kategorií neplave.
Já bych spíš řekl, že jsem k ní jenom tak velmi zlehounka, z velké dálky a s velkou opatrností, abych se moc nezakuckal, přičichl ;)
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 20:07:50
ostatně je zde asi tak jediný, co v teorii kategorií neplave.
Já bych spíš řekl, že jsem k ní jenom tak velmi zlehounka, z velké dálky a s velkou opatrností, abych se moc nezakuckal, přičichl ;)
Evidentně to stačí k tomu, abys tu nepsal totální bláboly jako mnozí tady.
Název: Re:Funktory v C++
Přispěvatel: andy 09. 05. 2017, 21:24:23
Citace: Mirek Prymek
Určitě, ale měl by vědět, že to je jenom (velmi dobrý) způsob, jak si to představit, ne že to "je ono".
Nekritizoval tě tu někdo v nějakém jiném vlákně za něco podobného?   ;)

Citace
Funkce není funktor ve smyslu otázky ani s nimi nemá nic společného.
Ale ve smyslu otázky to je. Spíš bych řekl, že odpověď ve smyslu category theory nebyla smyslem otázky. Jako jasně, můžeme se začít bavit o endofunktorech, morfismech apod., ale nakonec stejně skončíme s tím, že prakticky vzato je to (v drtivé většině využítí) kontejner a jako zajímavost, function object, který vrací T je funktor taky (a že se na to, svým způsobem, taky dá dívat jako na kontejner).
Název: Re:Funktory v C++
Přispěvatel: zboj 09. 05. 2017, 22:43:12
Citace: Mirek Prymek
Určitě, ale měl by vědět, že to je jenom (velmi dobrý) způsob, jak si to představit, ne že to "je ono".
Nekritizoval tě tu někdo v nějakém jiném vlákně za něco podobného?   ;)

Citace
Funkce není funktor ve smyslu otázky ani s nimi nemá nic společného.
Ale ve smyslu otázky to je. Spíš bych řekl, že odpověď ve smyslu category theory nebyla smyslem otázky. Jako jasně, můžeme se začít bavit o endofunktorech, morfismech apod., ale nakonec stejně skončíme s tím, že prakticky vzato je to (v drtivé většině využítí) kontejner a jako zajímavost, function object, který vrací T je funktor taky (a že se na to, svým způsobem, taky dá dívat jako na kontejner).
Otázka byla zcela zjevně o konceptu z teorie kategorií. Ale na druhou stranu je dobře, že se aspoň vyjasnila terminologie (včetně toho Prologu, tam to je fakt na přesdržku  >:().
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 09. 05. 2017, 23:04:16
Nekritizoval tě tu někdo v nějakém jiném vlákně za něco podobného?   ;)
Ne, za přesně opačnou věc :)

a jako zajímavost, function object, který vrací T je funktor taky (a že se na to, svým způsobem, taky dá dívat jako na kontejner).
Functor může být cokoli, když si kategorie nadefinuješ tak, aby byly splněna ta definice, co jsi psal. Ale v tom běžném chápání, jak je v Haskellu ("kategorie Hask"), jsou funkce morfismy. Viz https://en.wikibooks.org/wiki/Haskell/Category_theory#Functors_on_Hask

Citace
Translating categorical concepts into Haskell
Functors provide a good example of how category theory gets translated into Haskell. The key points to remember are that:

We work in the category Hask and its subcategories.
Objects are types.
Morphisms are functions.
Things that take a type and return another type are type constructors.
Things that take a function and return another function are higher-order functions.
Typeclasses, along with the polymorphism they provide, make a nice way of capturing the fact that in category theory things are often defined over a number of objects at once.
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 12:40:17
Nekritizoval tě tu někdo v nějakém jiném vlákně za něco podobného?   ;)
Ne, za přesně opačnou věc :)

a jako zajímavost, function object, který vrací T je funktor taky (a že se na to, svým způsobem, taky dá dívat jako na kontejner).
Functor může být cokoli, když si kategorie nadefinuješ tak, aby byly splněna ta definice, co jsi psal. Ale v tom běžném chápání, jak je v Haskellu ("kategorie Hask"), jsou funkce morfismy. Viz https://en.wikibooks.org/wiki/Haskell/Category_theory#Functors_on_Hask

Citace
Translating categorical concepts into Haskell
Functors provide a good example of how category theory gets translated into Haskell. The key points to remember are that:

We work in the category Hask and its subcategories.
Objects are types.
Morphisms are functions.
Things that take a type and return another type are type constructors.
Things that take a function and return another function are higher-order functions.
Typeclasses, along with the polymorphism they provide, make a nice way of capturing the fact that in category theory things are often defined over a number of objects at once.
V Haskellu je ten problém, že zavádí svou terminologii. Pak je v tom ještě větší brajgl.
Název: Re:Funktory v C++
Přispěvatel: BoneFlute 10. 05. 2017, 13:34:28
V Haskellu je ten problém, že zavádí svou terminologii. Pak je v tom ještě větší brajgl.
To možná jo, ale přijde mi výstižnější. V Haskellu je typ type, a třída class. V javě se typu říká class a třídám interface. A v C++ je to ještě zajímavější.
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 13:35:25
V Haskellu je ten problém, že zavádí svou terminologii. Pak je v tom ještě větší brajgl.
Co máš namysli?
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 13:40:31
V Haskellu je ten problém, že zavádí svou terminologii. Pak je v tom ještě větší brajgl.
To možná jo, ale přijde mi výstižnější. V Haskellu je typ type, a třída class. V javě se typu říká class a třídám interface. A v C++ je to ještě zajímavější.
No jo, v Javě a C++ apod. to už je terminologie OOP (přiohnutá). Já myslel jen v kontextu FP.
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 13:47:18
V Haskellu je ten problém, že zavádí svou terminologii. Pak je v tom ještě větší brajgl.
Co máš namysli?
Tak třeba že jedné části funktoru se říká "typový konstruktor" a druhé "fmap", to nejen že nemá oporu jinde (je to vycucané z prstu), ale navíc to svádí k domněnce, že jde o dvě různé věci.
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 13:56:10
Tak třeba že jedné části funktoru se říká "typový konstruktor" a druhé "fmap", to nejen že nemá oporu jinde (je to vycucané z prstu), ale navíc to svádí k domněnce, že jde o dvě různé věci.
No jo no, tak to je asi daný tím, že tu první část (mapování objektů) máš už v "hlavičce"
Kód: [Vybrat]
class Functor (f :: * -> *) where
...čili Functor v Haskellu je jeden konkrétní funktor (Hask -> neco Hask).

Kdyby měl být Functor jakýkoli obecný functor, tak už by tomu asi nerozuměl vůbec nikdo, když už i takhle s tím lidi mají problémy :) Člověk to musí brát tak, že Haskell nemá modelovat CT v její obecnosti, ale jenom ji využívá pro jeden konkrétní účel...
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 14:02:34
Tak třeba že jedné části funktoru se říká "typový konstruktor" a druhé "fmap", to nejen že nemá oporu jinde (je to vycucané z prstu), ale navíc to svádí k domněnce, že jde o dvě různé věci.
No jo no, tak to je asi daný tím, že tu první část (mapování objektů) máš už v "hlavičce"
Kód: [Vybrat]
class Functor (f :: * -> *) where
...čili Functor v Haskellu je jeden konkrétní funktor (Hask -> neco Hask).

Kdyby měl být Functor jakýkoli obecný functor, tak už by tomu asi nerozuměl vůbec nikdo, když už i takhle s tím lidi mají problémy :) Člověk to musí brát tak, že Haskell nemá modelovat CT v její obecnosti, ale jenom ji využívá pro jeden konkrétní účel...
Já tu motivaci chápu, ale je to matoucí pro lidi, co do toho vidí do hloubky. Možná to je kompromis mezi "uděláme to přesně do puntíku superformálně matematicky" a "uděláme to nějak tak jakž takž, aby to pobral i Pepa, co sedí za rohem v Lidlu za kasou". Jenže v prvním případě to je pak dost nepřesné a v tom druhém to stejně nakonec skončí přidáváním různých epicyklů, takže to stejně skončí jako složitost. Nedávno (tebou) zmíněný Prolog mimochodem dtto, vyjde se z jednoduché a jasné (a jasně a přesně už dříve nezávisle na konkrétním použití formulované) myšlenky a skončí to kočkopsem s hromadou vlastních výjimek (a vlastní terminologií).
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 14:09:47
Já tu motivaci chápu, ale je to matoucí pro lidi, co do toho vidí do hloubky. Možná to je kompromis mezi "uděláme to přesně do puntíku superformálně matematicky" a "uděláme to nějak tak jakž takž, aby to pobral i Pepa, co sedí za rohem v Lidlu za kasou". Jenže v prvním případě to je pak dost nepřesné a v tom druhém to stejně nakonec skončí přidáváním různých epicyklů, takže to stejně skončí jako složitost. Nedávno (tebou) zmíněný Prolog mimochodem dtto, vyjde se z jednoduché a jasné (a jasně a přesně už dříve nezávisle na konkrétním použití formulované) myšlenky a skončí to kočkopsem s hromadou vlastních výjimek (a vlastní terminologií).
No jo, jenže se prostě bavíme o programovacích jazycích, kde primární motivace je vytvořit něco, v čem se dá dobře programovat a ne něco, co supervěrně modeluje matematickou teorii. Dovedeš si představit, jak by ten formálně přesný functor mohl vypadat?
Kód: [Vybrat]
mapObject : ??? -> ???
mapMorphism : ??? -> ???
...kde
Kód: [Vybrat]
??? by mohlo být úplně cokoli... :) To by asi byla pěkná makačka na bednu nějak to smysluplně definovat a ještě ke všemu pro to napsat překladač :)

U toho Prologu je to imho podobně - zjistilo se, že pro praktické generické použití ten jednoduchý model nestačí a šup, je potřeba tam přidat různý specialitky ;) Osobně mi to taky sympatický není, kdyby Prolog zůstal jenom jako "dotazovací jazyk" (podobně jako Datalog) a nedělal se z něho generický programovací jazyk (který pak stejně máo kdo umí dobře použít), přišel by mi sympatičtější.
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 14:14:43
Já tu motivaci chápu, ale je to matoucí pro lidi, co do toho vidí do hloubky. Možná to je kompromis mezi "uděláme to přesně do puntíku superformálně matematicky" a "uděláme to nějak tak jakž takž, aby to pobral i Pepa, co sedí za rohem v Lidlu za kasou". Jenže v prvním případě to je pak dost nepřesné a v tom druhém to stejně nakonec skončí přidáváním různých epicyklů, takže to stejně skončí jako složitost. Nedávno (tebou) zmíněný Prolog mimochodem dtto, vyjde se z jednoduché a jasné (a jasně a přesně už dříve nezávisle na konkrétním použití formulované) myšlenky a skončí to kočkopsem s hromadou vlastních výjimek (a vlastní terminologií).
No jo, jenže se prostě bavíme o programovacích jazycích, kde primární motivace je vytvořit něco, v čem se dá dobře programovat a ne něco, co supervěrně modeluje matematickou teorii. Dovedeš si představit, jak by ten formálně přesný functor mohl vypadat?
Kód: [Vybrat]
mapObject : ??? -> ???
mapMorphism : ??? -> ???
...kde
Kód: [Vybrat]
??? by mohlo být úplně cokoli... :) To by asi byla pěkná makačka na bednu nějak to smysluplně definovat a ještě ke všemu pro to napsat překladač :)
Já ale nekritizuju, jak to je udělané v kódu, jen jsem kritizoval terminologii. Je jasné, že v implementaci vždy budou kompromisy a zjednodušení.
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 14:17:37
Já ale nekritizuju, jak to je udělané v kódu, jen jsem kritizoval terminologii. Je jasné, že v implementaci vždy budou kompromisy a zjednodušení.
Takže by ti v podstatě stačilo, kdyby se typovému konstruktoru říkalo nějak jako "the object-mapping functor part". Tak ti nevím ;)
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 14:19:38
U toho Prologu je to imho podobně - zjistilo se, že pro praktické generické použití ten jednoduchý model nestačí a šup, je potřeba tam přidat různý specialitky ;) Osobně mi to taky sympatický není, kdyby Prolog zůstal jenom jako "dotazovací jazyk" (podobně jako Datalog) a nedělal se z něho generický programovací jazyk (který pak stejně máo kdo umí dobře použít), přišel by mi sympatičtější.
Tak to je právě ten problém, ono to není pro "praktické generické" použití, motykou taky nekácím strom, i když by to nějak vyďoubat třeba šlo. Prolog má sílu pro dedukci, nejlépe s nějakým doplňkem pro nonfloundering teorie (jinak to je taky dost nedostatečné). Dělat v tom GUI a jánevímco je jako dělat GUI v SQL. Nicméně opět, nešlo mi o čistotu Prologu, jen o terminologii (tady za to může Kowalski).
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 14:21:37
je jako dělat GUI v SQL
Jo, to je dobrý přirovnání :)
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 14:25:46
Já ale nekritizuju, jak to je udělané v kódu, jen jsem kritizoval terminologii. Je jasné, že v implementaci vždy budou kompromisy a zjednodušení.
Takže by ti v podstatě stačilo, kdyby se typovému konstruktoru říkalo nějak jako "the object-mapping functor part". Tak ti nevím ;)
To je zrovna jen další výmysl ("když je bordel v terminologii, uděláme úplně novou" ;D). Matematicky to je "functor restricted on (the category of types') objects". V matematice se ostatně často může říct jen "funktor", když ta restrikce plyne z kontextu (což většinou plyne, a když ne, tak se to upřesní). Podobně, proč se používá "fmap" (to je možná ještě horší, protože "type constructor" je aspoň výstižné)?
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 14:30:04
Podobně, proč se používá "fmap" (to je možná ještě horší, protože "type constructor" je aspoň výstižné)?
Jednoduše proto, že to má stejnou signaturu jako List.map, tak si to každej aspoň zapamatuje a je mu to intuitivně jasný ;)

Myslím, že to trochu hrotíš :)
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 14:31:27
Podobně, proč se používá "fmap" (to je možná ještě horší, protože "type constructor" je aspoň výstižné)?
Jednoduše proto, že to má stejnou signaturu jako List.map, tak si to každej aspoň zapamatuje a je mu to intuitivně jasný ;)

Myslím, že to trochu hrotíš :)
U seznamu to je jasný, ale třeba u kontinuace?
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 14:32:54
U seznamu to je jasný, ale třeba u kontinuace?
Ty bys toho taky chtěl, furt! ;)

P.S. asi radši skončíme, ne, rozjeli jsme tady solidní off-topic :)
Název: Re:Funktory v C++
Přispěvatel: zboj 10. 05. 2017, 14:35:17
U seznamu to je jasný, ale třeba u kontinuace?
Ty bys toho taky chtěl, furt! ;)

P.S. asi radši skončíme, ne, rozjeli jsme tady solidní off-topic :)
Jo, jdu dělat něco smysluplného (pandas), drž mi palce, můj notebook má jen 64GB RAM  ;)
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 10. 05. 2017, 14:36:53
smysluplného (pandas)
Pozdravuj GIL ;)
Název: Re:Funktory v C++
Přispěvatel: František Ryšánek 11. 05. 2017, 14:01:36
Jakožto hobbík a lopata odkojená packalem a základy x86 ASM nabídnu ještě svůj příběh, jak a kde jsem potkal functor:

Před lety, už dávno po škole, jsem potkal programátorský problém natolik zábavný a složitý, že donutil ten kus hovězího co nosím v lebce, zamýšlet se nad OOP a snažit se ho ztéci (s odpuštěním) cestou C++. Průvodcem mi byl pan Bruce Eckel.
Dodnes nechápu, proč svoji dvoudílnou knihu "Thinking in C++", když už ji zveřejnil v HTML, vystavil ji v podobě dvou ZIPů, tzn. nevystavil to HTML na webu přímo, aby bylo přímo odkazovatelné, googlovatelné apod. Nevadí. O functorech resp. "function objectech" mluví cca na dvou navzájem dost vzdálených místech v druhém dílu (http://www.mindviewinc.com/downloads/TICPP-2nd-ed-Vol-two.zip). Najděte v ZIPu jediný HTML soubor a hledejte text "functor". Dovolím si dva citáty:

Citace
In Advanced C++: Programming Styles And Idioms (Addison Wesley, 1992), Jim Coplien coins the term functor which is an object whose sole purpose is to encapsulate a function (since “functor” has a meaning in mathematics, we shall use the more explicit term function object). The point is to decouple the choice of function to be called from the site where that function is called.

Tohle chápu tak, že functor je jenom objekt, obalující funkci, tak aby se dala předat jako parametr. Tzn. v této rovině je to jenom "zaobjektěná náhražka" klasické Céčkové syntaxe pro předání pointeru na funkci včetně úplného prototypu. A v zásadě není ani potřeba, aby ten functor obsahoval redefinici metody "operator()".

Sám Bruce Eckel raději hovoří o "function objectech" než o functorech, a jeho druhý díl o tom obsahuje samostatnou kapitolu. Podotýkám, že ta kniha je na dnešní poměry už dost stará.

Děkuji předřečníkům za vysvětlivku, že lze overloadnout operator().

Kdysi tuším na nějakých "gtree" objektech jsem se naučil, podstrčit stromu svou vlastní porovnávací funkci. Později jsem totéž hledal u std::map, a seznal jsem, že std::map toto také umí, ale vyžaduje, abych tu porovnávací funkci zabalil do "functoru". Tak jsem si našel nějaký example a levou zadní jsem to použil, aniž bych zkoumal nějaký hlubší smysl.

Dneska když tak kolem toho browsím, našel jsem nějaký example na Stack Overflow (http://stackoverflow.com/questions/5733254/create-an-own-comparator-for-map).
Název: Re:Funktory v C++
Přispěvatel: hawran diskuse 11. 05. 2017, 14:28:53
Jaká náhoda, kolega sdílnul toto:
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html (http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html)
(tak sdílím dál)
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 11. 05. 2017, 14:51:14
Jaká náhoda, kolega sdílnul toto:
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html (http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html)
(tak sdílím dál)
:)

Pokud někdo chcete polopatistické vysvětlení toho "skutečného" funktoru, tak tohle je docela dobrý: http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
Název: Re:Funktory v C++
Přispěvatel: zboj 11. 05. 2017, 16:42:17
Jakožto hobbík a lopata odkojená packalem a základy x86 ASM nabídnu ještě svůj příběh, jak a kde jsem potkal functor:

Před lety, už dávno po škole, jsem potkal programátorský problém natolik zábavný a složitý, že donutil ten kus hovězího co nosím v lebce, zamýšlet se nad OOP a snažit se ho ztéci (s odpuštěním) cestou C++. Průvodcem mi byl pan Bruce Eckel.
Dodnes nechápu, proč svoji dvoudílnou knihu "Thinking in C++", když už ji zveřejnil v HTML, vystavil ji v podobě dvou ZIPů, tzn. nevystavil to HTML na webu přímo, aby bylo přímo odkazovatelné, googlovatelné apod. Nevadí. O functorech resp. "function objectech" mluví cca na dvou navzájem dost vzdálených místech v druhém dílu (http://www.mindviewinc.com/downloads/TICPP-2nd-ed-Vol-two.zip). Najděte v ZIPu jediný HTML soubor a hledejte text "functor". Dovolím si dva citáty:

Citace
In Advanced C++: Programming Styles And Idioms (Addison Wesley, 1992), Jim Coplien coins the term functor which is an object whose sole purpose is to encapsulate a function (since “functor” has a meaning in mathematics, we shall use the more explicit term function object). The point is to decouple the choice of function to be called from the site where that function is called.

Tohle chápu tak, že functor je jenom objekt, obalující funkci, tak aby se dala předat jako parametr. Tzn. v této rovině je to jenom "zaobjektěná náhražka" klasické Céčkové syntaxe pro předání pointeru na funkci včetně úplného prototypu. A v zásadě není ani potřeba, aby ten functor obsahoval redefinici metody "operator()".

Sám Bruce Eckel raději hovoří o "function objectech" než o functorech, a jeho druhý díl o tom obsahuje samostatnou kapitolu. Podotýkám, že ta kniha je na dnešní poměry už dost stará.

Děkuji předřečníkům za vysvětlivku, že lze overloadnout operator().

Kdysi tuším na nějakých "gtree" objektech jsem se naučil, podstrčit stromu svou vlastní porovnávací funkci. Později jsem totéž hledal u std::map, a seznal jsem, že std::map toto také umí, ale vyžaduje, abych tu porovnávací funkci zabalil do "functoru". Tak jsem si našel nějaký example a levou zadní jsem to použil, aniž bych zkoumal nějaký hlubší smysl.

Dneska když tak kolem toho browsím, našel jsem nějaký example na Stack Overflow (http://stackoverflow.com/questions/5733254/create-an-own-comparator-for-map).
Ještě jednou pro ty pomalejší - otázka není o volatelných objektech, ale o (matematických) funktorech.
Název: Re:Funktory v C++
Přispěvatel: UF 11. 05. 2017, 17:26:10
Jakožto hobbík a lopata odkojená packalem a základy x86 ASM nabídnu ještě svůj příběh, jak a kde jsem potkal functor:

Před lety, už dávno po škole, jsem potkal programátorský problém natolik zábavný a složitý, že donutil ten kus hovězího co nosím v lebce, zamýšlet se nad OOP a snažit se ho ztéci (s odpuštěním) cestou C++. Průvodcem mi byl pan Bruce Eckel.
Dodnes nechápu, proč svoji dvoudílnou knihu "Thinking in C++", když už ji zveřejnil v HTML, vystavil ji v podobě dvou ZIPů, tzn. nevystavil to HTML na webu přímo, aby bylo přímo odkazovatelné, googlovatelné apod. Nevadí. O functorech resp. "function objectech" mluví cca na dvou navzájem dost vzdálených místech v druhém dílu (http://www.mindviewinc.com/downloads/TICPP-2nd-ed-Vol-two.zip). Najděte v ZIPu jediný HTML soubor a hledejte text "functor". Dovolím si dva citáty:

Citace
In Advanced C++: Programming Styles And Idioms (Addison Wesley, 1992), Jim Coplien coins the term functor which is an object whose sole purpose is to encapsulate a function (since “functor” has a meaning in mathematics, we shall use the more explicit term function object). The point is to decouple the choice of function to be called from the site where that function is called.

Tohle chápu tak, že functor je jenom objekt, obalující funkci, tak aby se dala předat jako parametr. Tzn. v této rovině je to jenom "zaobjektěná náhražka" klasické Céčkové syntaxe pro předání pointeru na funkci včetně úplného prototypu. A v zásadě není ani potřeba, aby ten functor obsahoval redefinici metody "operator()".

Sám Bruce Eckel raději hovoří o "function objectech" než o functorech, a jeho druhý díl o tom obsahuje samostatnou kapitolu. Podotýkám, že ta kniha je na dnešní poměry už dost stará.

Děkuji předřečníkům za vysvětlivku, že lze overloadnout operator().

Kdysi tuším na nějakých "gtree" objektech jsem se naučil, podstrčit stromu svou vlastní porovnávací funkci. Později jsem totéž hledal u std::map, a seznal jsem, že std::map toto také umí, ale vyžaduje, abych tu porovnávací funkci zabalil do "functoru". Tak jsem si našel nějaký example a levou zadní jsem to použil, aniž bych zkoumal nějaký hlubší smysl.

Dneska když tak kolem toho browsím, našel jsem nějaký example na Stack Overflow (http://stackoverflow.com/questions/5733254/create-an-own-comparator-for-map).
Ještě jednou pro ty pomalejší - otázka není o volatelných objektech, ale o (matematických) funktorech.

Zboji - dej jeden vo indianech...
Název: Re:Funktory v C++
Přispěvatel: UF 11. 05. 2017, 18:53:52
...
Ještě jednou pro ty pomalejší - otázka není o volatelných objektech, ale o (matematických) funktorech.

Zboji - dej jeden vo indianech...

... to bylo mysleno vazne (jenom abys to nebral zle) ... zajima me to asi vic nez funktory a neni kde jinde se na to zeptat :)
Název: Re:Funktory v C++
Přispěvatel: zboj 11. 05. 2017, 19:03:16
...
Ještě jednou pro ty pomalejší - otázka není o volatelných objektech, ale o (matematických) funktorech.

Zboji - dej jeden vo indianech...

... to bylo mysleno vazne (jenom abys to nebral zle) ... zajima me to asi vic nez funktory a neni kde jinde se na to zeptat :)
Založ téma, třeba "morfosyntax jazyků kmenů horního Peru a přilehlých oblastí a její automatická analýza metodou skrytých Markovových modelů" nebo něco podobně běžného v rámci IT, to pak bude zajímavá diskuse ;)
Název: Re:Funktory v C++
Přispěvatel: andy 11. 05. 2017, 19:13:57
V Haskellu je ten problém, že zavádí svou terminologii. Pak je v tom ještě větší brajgl.
Citace: Mirek Prýmek
...čili Functor v Haskellu je jeden konkrétní funktor (Hask -> neco Hask).
No on problém je, že (pokud to teda dobře chápu) veškeré funktory v haskellu jsou (Hask -> Hask). Protože typ je objekt, a všechno je to v kategorii Hask. Takže je to vlastně všechno endofunktor.... což teda ve výsledku nějakému pochopení teda vůbec nepomáhá....
Název: Re:Funktory v C++
Přispěvatel: zboj 11. 05. 2017, 19:20:22
V Haskellu je ten problém, že zavádí svou terminologii. Pak je v tom ještě větší brajgl.
Citace: Mirek Prýmek
...čili Functor v Haskellu je jeden konkrétní funktor (Hask -> neco Hask).
No on problém je, že (pokud to teda dobře chápu) veškeré funktory v haskellu jsou (Hask -> Hask). Protože typ je objekt, a všechno je to v kategorii Hask. Takže je to vlastně všechno endofunktor.... což teda ve výsledku nějakému pochopení teda vůbec nepomáhá....
Správně, všechno to jsou endofunktory, jinak bychom nad tím nemohli stavět monády.
Název: Re:Funktory v C++
Přispěvatel: UF 11. 05. 2017, 20:14:05
...
Ještě jednou pro ty pomalejší - otázka není o volatelných objektech, ale o (matematických) funktorech.

Zboji - dej jeden vo indianech...

... to bylo mysleno vazne (jenom abys to nebral zle) ... zajima me to asi vic nez funktory a neni kde jinde se na to zeptat :)
Založ téma, třeba "morfosyntax jazyků kmenů horního Peru a přilehlých oblastí a její automatická analýza metodou skrytých Markovových modelů" nebo něco podobně běžného v rámci IT, to pak bude zajímavá diskuse ;)

tak z toho nebude nic - nekdo to furt maze ... skoda
Název: Re:Funktory v C++
Přispěvatel: František Ryšánek 12. 05. 2017, 07:29:31
@zboj

Ajo fakt, ta syntax v původním dotazu je vážně dost jiná, než co jsem zatím potkal. Omluva, a díky za podrobné vysvětlení. Rychlejc píšu než čtu a chápu. Se zájmem jsem si včera přečetl ten link, jak se to dělá v Haskellu, ale nedošlo mi, že tahle úroveň abstrakce je dnes legální v CPP :-) Asi bych si měl doštudovat o kus dál, co to přesně znamená a odkud se to (z matiky) vzalo, v tuto chvíli děkuji za "budíček".
Název: Re:Funktory v C++
Přispěvatel: František Ryšánek 12. 05. 2017, 08:12:05
Jak jsem říkal, píšu rychleji než domýšlím. Vždyť ten jeden řádek zdrojáku v původním dotazu je obyčejná deklarace šablonové třídy. Žádná vyšší magie. Co ta třída dál dělá/obsahuje, není v dotazu uvedeno. Je zmíněna "kniha o metaprogramování", ale bez úplného uvedení zdroje - takže pro mě těžko říct, jestli autor knihy myslel function object (pokud ta šablonová třída obaluje funkci) nebo skutečně functor v obecnějším slova smyslu. Čili... soudím že kolega Zboj je v oboru namočený o dvě ligy víc než já a vidí dál, pokud kategoricky tvrdí, že se jedná o "functor v obecném a původním slova smyslu" :-) Což ti rychlejší tady asi pochopili po druhém až třetím příspěvku v této debatě...
Název: Re:Funktory v C++
Přispěvatel: zboj 12. 05. 2017, 09:29:28
Jak jsem říkal, píšu rychleji než domýšlím. Vždyť ten jeden řádek zdrojáku v původním dotazu je obyčejná deklarace šablonové třídy. Žádná vyšší magie. Co ta třída dál dělá/obsahuje, není v dotazu uvedeno. Je zmíněna "kniha o metaprogramování", ale bez úplného uvedení zdroje - takže pro mě těžko říct, jestli autor knihy myslel function object (pokud ta šablonová třída obaluje funkci) nebo skutečně functor v obecnějším slova smyslu.
Ono to je z té deklarace vidět celkem jasně. Soudím, že většina zná v C++ jen funktory jako funkční objekty a vůbec neví, co jsou v generickém programování kategorie typů a jak lze formálně nahlížet šablony. Potom odpovídají bez porozumění otázce. Kdyby byl dotaz z Javy s příkladem obsahujícím varianci typů, zmatek by nevznikl (byť průměrný javista taky neví, která bije). To by vlastně byla docela zajímavá anketa mezi javisty, zjistit, zda umí deklarovat jednoduchý kontravariantní funktor v jejich oblíbeném jazyce  :)
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 12. 05. 2017, 11:00:01
Vždyť ten jeden řádek zdrojáku v původním dotazu je obyčejná deklarace šablonové třídy. Žádná vyšší magie.
Nějaký konkrétní functor sám o sobě žádná vysoká magie není. Trochu náročnější je teprve pochopit, že tahle konkrétní věc je instancí obecného konceptu. Jak už jsem psal jinde, něco jiného je umět sčítat celá čísla a něco jiného je pochopit, že sčítání na celých číslech je grupa a co z toho plyne za důsledky.

Magie může přijít až tehdy, když mám nějakou operaci, která funguje na (obecné, jakékoli) grupě. Což třeba s tím functorem nevím jestli v C++ jde (a jestli jde, tak nechci vědět jak ;) ).
Název: Re:Funktory v C++
Přispěvatel: zboj 12. 05. 2017, 11:05:35
Vždyť ten jeden řádek zdrojáku v původním dotazu je obyčejná deklarace šablonové třídy. Žádná vyšší magie.
Nějaký konkrétní functor sám o sobě žádná vysoká magie není. Trochu náročnější je teprve pochopit, že tahle konkrétní věc je instancí obecného konceptu. Jak už jsem psal jinde, něco jiného je umět sčítat celá čísla a něco jiného je pochopit, že sčítání na celých číslech je grupa a co z toho plyne za důsledky.

Magie může přijít až tehdy, když mám nějakou operaci, která funguje na (obecné, jakékoli) grupě. Což třeba s tím functorem nevím jestli v C++ jde (a jestli jde, tak nechci vědět jak ;) ).
Neláká tě metaprogramování?  ;D :P
Název: Re:Funktory v C++
Přispěvatel: Mirek Prýmek 12. 05. 2017, 11:07:06
Neláká tě metaprogramování?  ;D :P
V C++ mě neláká ani programování, natož meta ;)
Název: Re:Funktory v C++
Přispěvatel: haha 12. 05. 2017, 11:45:37
Od člověka s větším nadáním než má pan *zboj* a spol., je to všechno pochopitelnější: https://bartoszmilewski.com/
Název: Re:Funktory v C++
Přispěvatel: zboj 19. 05. 2017, 17:51:25
Od člověka s větším nadáním než má pan *zboj* a spol., je to všechno pochopitelnější: https://bartoszmilewski.com/
Jo, Milewski má fajn blog, ale stejně to tam není moc polopatě, spíš pro hooodně pokročilé v IT a zběhlé v matematice. Kdo pochopí vše, co na svém blogu píše, může se považovat za odborníka v oblasti FP (a potažmo dobrého informatika).
Název: Re:Funktory v C++
Přispěvatel: haha 20. 05. 2017, 11:37:27
Od člověka s větším nadáním než má pan *zboj* a spol., je to všechno pochopitelnější: https://bartoszmilewski.com/
Jo, Milewski má fajn blog, ale stejně to tam není moc polopatě, spíš pro hooodně pokročilé v IT a zběhlé v matematice. Kdo pochopí vše, co na svém blogu píše, může se považovat za odborníka v oblasti FP (a potažmo dobrého informatika).
Nic proti, bylo to takové popíchnutí. Někdy se mi zdá, že se tu rozjedete, jak dva staří alchymisti :D. Já nemám sice matematické vzdělání, ale jde to postupně pochopit, takže pro člověka z IT by to neměl být problém. Milewski mi otevřel oči pro C++. Ne že by ho bylo lehčí díky tomu psát, ale už mi nepřipadá jako nepovedené C.
Název: Re:Funktory v C++
Přispěvatel: zboj 20. 05. 2017, 11:40:15
Od člověka s větším nadáním než má pan *zboj* a spol., je to všechno pochopitelnější: https://bartoszmilewski.com/
Jo, Milewski má fajn blog, ale stejně to tam není moc polopatě, spíš pro hooodně pokročilé v IT a zběhlé v matematice. Kdo pochopí vše, co na svém blogu píše, může se považovat za odborníka v oblasti FP (a potažmo dobrého informatika).
Nic proti, bylo to takové popíchnutí. Někdy se mi zdá, že se tu rozjedete, jak dva staří alchymisti :D. Já nemám sice matematické vzdělání, ale jde to postupně pochopit, takže pro člověka z IT by to neměl být problém. Milewski mi otevřel oči pro C++. Ne že by ho bylo lehčí díky tomu psát, ale už mi nepřipadá jako nepovedené C.
No vida, tak to Milewski spáchal dobrý skutek :)