Что особенного в ключевом слове «возврат»
Когда мне показалось, что я понимаю, для чего нужен возврат в 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