Ano, PHP má monády. Jen se v něm tento pojem nepoužívá.
To je zavádějící, ne-li přímo nepravdivé.
Znovu moje oblíbená analogie: to, že jazyk "má sčítání" a "má celá čísla" NEimplikuje, že "má grupy".
Každý jazyk dokáže pracovat s nějakou strukturou, kterou s trochou snahy můžu popsat jako monádu (minimálně třeba s Listem), ale to, o co opravdu jde, je, jestli jazyk umí pracovat s pojmem "monáda" jako
abstraktem, ne s konkrétní "instancí" tohoto obecného konceptu. Tohle je potřeba rozlišovat.
Nebo ještě jinak: v Haskellu můžu mít funkci, která něco dělá s nějakou hodnotou typu X přičemž ví jenom to, že X je monáda. Neví, jestli je to List nebo Maybe a je jí to jedno. Pro ni je to prostě monáda a využívá vlastností, které monáda má. Něco takového bys v PHP implementoval asi dost obtížně, protože je k tomu potřeba docela sofistikovaný typový systém.
https://blog.ircmaxell.com/2013/07/taking-monads-to-oop-php.html
Takovéhle příklady mi přijdou spíš věci zamlžovat než objasňovat. Člověk, který ví, co to monáda je, to může brát jako srandacvičení na tohle téma, takovou PHP-rozvičku. Ale člověka, který to neví, to jenom zmate.
Hlavní chyba toho příkladu je v tom, že když ho neznalý člověk uvidí, tak si logicky řekne "aha, takže monády jsou vlastně úplná kokotina, která není k ničemu dobrá" - a bude mít pravdu, protože místo téhle překombinované opičárny mohl použít úplně normální řetězení funkcí a efekt by by stejný.
Za druhé mám docela pochybnosti o tom, jestli to má vůbec napsané dobře. Nechce se mi teď po ránu nad tím úplně dumat a PHP neznám, takže se možná mýlím, nicméně: bind (EDIT: respektive ta funkce, která je jeho druhým parametrem) musí liftovat "obyčejnou" hodnotu do monády, to je jeho význam. V Haskellu:
(>>=) :: m a -> ( a -> m b) -> m b
- vezmu monadickou hodnotu a funkci z normální hodnoty do jiné monády a dostanu jako výsledek hodnotu v té jiné monádě.
Jenže on tam má:
$newMonad = $monad->bind(function($value) {
var_dump($value);
return $value / 2;
});
- ta "lambda" je z T do T. To je buď úplně blbě, nebo je to aspoň zavádějící (jak říkám, nechce se mi teď nad tím víc dumat).
Když už příklad tohodle typu (který je sám o sobě zavádějící, viz začátek příspěvku, ale nešť...), tak bych raději ukázal Promise v JS. To je hezká monáda, na které se to fungování dá celkem dobře ukázat.