Что особенного в ключевом слове «возврат»

Когда мне показалось, что я понимаю, для чего нужен возврат в Haskell, я попытался поиграть с разными альтернативами, и кажется, что возврат можно не только использовать в любом месте цепочки монад, но и полностью исключить.

*Main> Just 9 >>= \y -> (Just y) >>= \x -> return x
Just 9

*Main> Just 9 >>= \y -> (return y) >>= \x -> (Just y)
Just 9

*Main> Just 9 >>= \y -> (Just y) >>= \x -> (Just x)
Just 9 

Даже если я опускаю return в своем собственном экземпляре, я получаю только предупреждение ...

data MaybeG a = NothingG | JustG a deriving Show 
instance Monad MaybeG where  
    --    return x = JustG x  
        NothingG >>= f = NothingG  
        JustG x >>= f  = f x  
        fail _ = NothingG  

Monad.hs:3:10:
    Warning: No explicit method nor default method for `return'
    In the instance declaration for `Monad MaybeG'

и я все еще могу использовать монаду

*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (JustG y)
JustG 9

*Main> JustG 9 >>= \y -> (NothingG) >>= \x -> (JustG y)
NothingG

Так что же такого особенного в ключевом слове возврата? Это о более сложных случаях, когда я не могу пропустить это? Или потому, что это «правильный» способ делать вещи, даже если они могут быть выполнены по-другому?

ОБНОВИТЬ: .. или другой вариант, я мог бы де, оштрафовать мой собственный конструктор

finallyMyLastStepG :: Int -> MaybeG Int
finallyMyLastStepG a = JustG a  

и произвести другой вариант той же цепочки (с тем же результатом)

*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (finallyMyLastStepG y)
JustG 9

Ответы на вопрос(3)

Ваш ответ на вопрос