module Main where
main =
    putStrLn "-- Monad experiments, 11/2005 --"


-- example 1.1                                          m = list
 >> (putStrLn.show)                               -- equiv to...
      ( ["anna", "carol"] >>= \x ->        -- do x <- [..., ...]
        ["bill", "dave" ] >>= \y ->        --    y <- [..., ...]
        return (x,y)                       --    return (x,y)
      )                           --[(a,b), (a,d), (c,b), (c,d)]

-- example 1.2                                          m = list
 >> (putStrLn.show)
      ( ["anna", "carol"] >>= \x ->
        concat [ return [x],                  -- blob with TV
                 ["bill", "dave" ] >>= \y ->  -- a date?
                 if x > y then fail "bad vibe" else return [x,y]
               ]
      )                            --[[a],[a,b],[a,d],[c],[c,d]]


-- example 2                                           m = Maybe
 >> let sqrt x = if x >= 0 then Just(x**0.5) else Nothing
    in (putStrLn.show)
         ( sqrt 4 >>= \x ->
           sqrt 9 >>= \y ->
           return (x+y) )                            -- Just 5.0


-- example 3                                              m = IO
 >> return "print-me" >>= putStrLn
 >> fail "-- stopping by invoking IO's fail --"
-- ------------------------------------------------LA--11/2005--
