open monad io unsafe.cell unsafe.console liftM2 f m1 m2 = do x1 <- m1 x2 <- m2 return (f x1 x2) a k x1 x2 x3 x4 x5 = do r <- return $ ref k let b = & do k <- return $ pred (valueof r) a k b x1 x2 x3 x4 if k <= 0 then liftM2 (+) x4 x5 else b _ = a 10 (!!1) (!! -1) (!! -1) (!!1) (!!0) >>= (putStr << show) ::: IO where (!!) f = & return f ::: IO