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"