Higher-kinded types

neocon

Higher-kinded types
« kdy: 26. 02. 2018, 13:23:09 »
HKT mi přijdou super užitečné, je nějaký praktický důvod, proč se vyskytují jen ve funkcionálním programování? Kromě C++ teda, ale tam je zase celá syntax na palici, takže to člověk radši nepoužije.


Sten

Re:Higher-kinded types
« Odpověď #1 kdy: 26. 02. 2018, 14:06:49 »
Obdoba higher-order types je i v Javě (Function<T,R>) a C (void(*func)()), akorát nejsou přímo podporované typovým systémem, takže to formálně nejsou higher-order types.

Labrat

Re:Higher-kinded types
« Odpověď #2 kdy: 26. 02. 2018, 14:32:40 »
Obdoba higher-order types je i v Javě (Function<T,R>) a C (void(*func)()), akorát nejsou přímo podporované typovým systémem, takže to formálně nejsou higher-order types.
Function<T,R> není HKT, jeho kind je *→*→*. Aby to byl HKT, muselo by T nebo R být generické, což v Javě nejde. V C++ jde udělat například (*→*)→*, kde kind je řádu 1.

Labrat

Re:Higher-kinded types
« Odpověď #3 kdy: 26. 02. 2018, 15:01:35 »
Obdoba higher-order types je i v Javě (Function<T,R>) a C (void(*func)()), akorát nejsou přímo podporované typovým systémem, takže to formálně nejsou higher-order types.
Jinak HKT mozná dávají smysl hlavně ve funkcionálním paradigmatu, v OOP se těžko hledá nějaký neakademický příklad z praxe. Jinak jak tu nedávno kdosi psal, do Rustu a Swiftu autoři HKT nedali, neboť dle jejich slov je to na většinu vývojářů moc složité (v kódu by se pak často objevovalo ono neslavně proslulé "you are not expected to understand this").

Sten

Re:Higher-kinded types
« Odpověď #4 kdy: 26. 02. 2018, 15:36:39 »
Function<T,R> není HKT, jeho kind je *→*→*. Aby to byl HKT, muselo by T nebo R být generické, což v Javě nejde.

Function<?,?>. A za ? může být klidně další Function<?,?>.


Labrat

Re:Higher-kinded types
« Odpověď #5 kdy: 26. 02. 2018, 15:39:43 »
Function<T,R> není HKT, jeho kind je *→*→*. Aby to byl HKT, muselo by T nebo R být generické, což v Javě nejde.

Function<?,?>. A za ? může být klidně další Function<?,?>.
Ano, a to bude pořád jen *→*→*, protože parametry budou jen konkrétní typy, takže HKT se nekoná (v Javě jsou typové parametry jen plně specifikované typy).

Labrat

Re:Higher-kinded types
« Odpověď #6 kdy: 26. 02. 2018, 15:49:15 »
Function<T,R> není HKT, jeho kind je *→*→*. Aby to byl HKT, muselo by T nebo R být generické, což v Javě nejde.

Function<?,?>. A za ? může být klidně další Function<?,?>.
P.S. Po lopatě (v C++): Function<T,R> odpovídá function<R(T)>, což není HKT. HKT v C++ jsou templates templates, tedy template<template<typename> class T> ... - kind (*→*)→*, což ovšem Java neumí - parametrem generického typu je vždy konkrétní typ (tj. *).

Phi

Re:Higher-kinded types
« Odpověď #7 kdy: 26. 02. 2018, 18:46:42 »

v

Re:Higher-kinded types
« Odpověď #8 kdy: 26. 02. 2018, 18:54:57 »

itsux

Re:Higher-kinded types
« Odpověď #9 kdy: 26. 02. 2018, 22:05:19 »

Labrat

Re:Higher-kinded types
« Odpověď #10 kdy: 26. 02. 2018, 22:38:55 »
Tak já do toho hodím vidle. Co si myslíte o tomto:
https://medium.com/@johnmcclean/simulating-higher-kinded-types-in-java-b52a18b72c74
Něco na těch HKT bude, když i Sten se zamotal do higher-order functions, což je něco zcela jiného než higher-kinded typové konstruktory. Ovšem ta simulace v Javě je hnůj.

Func