Funktory v C++

andy

Re:Funktory v C++
« Odpověď #15 kdy: 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!


Sten

Re:Funktory v C++
« Odpověď #16 kdy: 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.

Re:Funktory v C++
« Odpověď #17 kdy: 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.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Funktory v C++
« Odpověď #18 kdy: 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.

Re:Funktory v C++
« Odpověď #19 kdy: 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).


Re:Funktory v C++
« Odpověď #20 kdy: 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.

UF

Re:Funktory v C++
« Odpověď #21 kdy: 09. 05. 2017, 18:05:59 »
panove - takhe tu vez nepostavite ani kdybyste se rozkrajeli!

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Funktory v C++
« Odpověď #22 kdy: 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.

andy

Re:Funktory v C++
« Odpověď #23 kdy: 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í....

andy

Re:Funktory v C++
« Odpověď #24 kdy: 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#

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Funktory v C++
« Odpověď #25 kdy: 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.

Re:Funktory v C++
« Odpověď #26 kdy: 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

Re:Funktory v C++
« Odpověď #27 kdy: 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 ;)

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Funktory v C++
« Odpověď #28 kdy: 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.

andy

Re:Funktory v C++
« Odpověď #29 kdy: 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).