Monáda (funkcionální programování): Porovnání verzí

m
Robot: -zastaralá značka HTML
(Upřesnění funktor->endofunktor)
značky: editace z mobilu editace z mobilního webu
m (Robot: -zastaralá značka HTML)
[[Continuation|Kontinuace]] v C++ lze reprezentovat (s využitím statického [[polymorfismus|polymorfismu]]) následující třídou:
 
<sourcesyntaxhighlight lang="cpp">
template<typename T> class Cont {
std::function<std::any(const std::function<std::any(T)>&)> fn;
std::any operator()(const std::function<std::any(T)>& f) const { return fn(f); }
};
</syntaxhighlight>
</source>
 
Aby byla '''Cont''' funktorem, musíme implementovat '''fmap''' nebo '''bind''':
 
<sourcesyntaxhighlight lang="cpp">
template<template<typename> class M, typename T, typename U> struct Bind;
template<typename T, typename U> struct Bind<Cont,T,U> {
}
};
</syntaxhighlight>
</source>
 
C++ nemá typy vyšších [[Druh (teorie typů)|druhů]], nicméně pomocí specializace šablon můžeme dosáhnout stejného efektu.
Konkrétně můžeme například definovat generické monadické operace '''fmap''' a '''join'''.
 
<sourcesyntaxhighlight lang="cpp">
template<template<typename> class M, typename T, typename U> struct Fmap {
std::function<U(T)> f;
return Bind<M,M<T>,T>{[](M<T> x) { return x; }}(m);
}
</syntaxhighlight>
</source>
 
Takto koncipovaný kód má tu výhodu, že poskytuje definice monadických funkcí bez ohledu na konkrétní typ. Proto stačí pro konkrétní monadický typ implementovat pouze buď '''bind''', nebo '''fmap''' a '''join''', podobně jako v čistě funkcionálních jazycích à la [[Haskell (programovací jazyk)|Haskell]].
421 473

editací