Assignment 1

Naimplementujte v C++ jednoduchý Maybe monad. Použite overloadovanie operatotov tak, aby sa váš monád dal pouzivat podobne ako sa používa Maybe monad v Haskeli. Teda, cca. takto:

safeSolve :: Float -> Float -> Float -> Maybe (Float, Float)
safeSolve a b c =
safeSqrt (b*b - 4 * a * c) >>= \s ->
safeDiv (-b + s) (2*a) >>= \x1 ->
safeDiv (-b - s) (2*a) >>= \x2 ->
pure (x1,x2)

Alebo ešte idealnejšie takto:

safeSolve a b c = do
s <- safeSqrt (b*b - 4 * a * c)
x1 <- safeDiv (-b + s) (2*a)
x2 <- safeDiv (-b - s) (2*a)
pure (x1,x2)

Dobry zdroj na pochopenie monadov https://tgdwyer.github.io/monad/

Hinty. Ak chcete použit unárny bind, asi chcete vedieť funkcie zmeniť na unárne, t.j. potrebujete volanie funkcií v tvare (+ 1 2), pričom už + 1 je korektný objekt (výsledkom je funkcia berúca číslo a vracajúca číslo). Toto je asi jednoduchšie ako urobiť variadický bind. Potrebujete si na to vybrať vhodný operátor,ktorý sa zátvorrkuje zľava doprava. Možno je dobrý operátor ,. Pre bindovanie dokonca máme k dispozícii veľmi podobné operátory <<=, >>=. Block do by sa mohol dat urobit jednak ako funkcia a taktiez ako konstanta so specialnym typom a vhodne overloadnutymi operatormi.

Deadline 5.4.2024
Riešenie posielajte e-mailom na lukotka zavinac dcs.fmph.uniba.sk so subjectom začinajúcim "PTS3"