Včera som som si to testoval, prečítal som o tom pár článkov a skúšal som si príklady. A potom som si týmto spôsobom sám vyskúšal naimplementovať funkcie map a filter aby sa mi to trochu dostalo do krvi:
https://pastebin.com/XWvc8ZgC
Teórii stále úplne na 100% nechápem (je to náročné na predstavivosť, kúpim si dáku knihu o funkcionálnom programovaní), ale už som viac v obraze... viem ako sa to zapisuje a tiež som pochopil aké to prináša výhody. A načo to využijem
Napríklad skladanie stromu pri rekurzívnom prechádzaní listu to značne uľahčuje.
Takže teraz už tomu rozumiem natoľko že to použil v jednom parseri s kontinuáciami pri rekurzii sa jedho kód veľmi zjednodušil.
Fakt bych začal s kontinuacemi bez toho “current”. Je to podrobně vysvětlené v textech o Haskellu. Kontinuace je prostě funkce typu (A->R)->R, která “vrací” hodnotu zavoláním funkce. Toto je klasická funkcionální definice (pozor, gill píše blbosti). Nejjednodušší případ je převod konstanty na kontinuaci: λx.λf.f(x) - této operaci, která zapouzdří hodnotu do kontinuace, se někdy říká unit. Protože kontinuace je funkce, zapouzdřená hodnota se z ní získá funkční aplikací, kdy se jí předá funkce typu A->R. Výhodou kontinuací je, že se dají skládat, dvě obecně různé kontinuace jsou sice funkce, ale s nekompatibilními typy, takže nejde přímo zavolat jedna na výsledek druhé, ale jdou spojit do jedné funkce tak, aby taky byla kontinuací.
Call/cc je jen zvláštní případ, kdy ona aplikace na “návratovou” hodnotu způsobí návrat výpočtu za volání call/cc, klidně i vícekrát, čímž se dosahuje nedeterminismu. Například operátor amb se takto často vnitřně implementuje.