¿Qué tiene de especial la palabra clave 'return'?
Cuando parecía entender qué es el retorno en Haskell, intenté jugar con diferentes alternativas y parece que el retorno no solo se puede usar en cualquier parte de la cadena de mónadas, sino que también se puede excluir por completo.
*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
Incluso si omito el retorno en mi propia instancia, solo recibo una advertencia ...
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'
y todavía puedo usar la mónada
*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (JustG y)
JustG 9
*Main> JustG 9 >>= \y -> (NothingG) >>= \x -> (JustG y)
NothingG
Entonces, ¿qué tiene de especial la palabra clave return? ¿Se trata de casos más complejos donde no puedo omitirlo? ¿O porque esta es la forma "correcta" de hacer las cosas, incluso si se pueden hacer de manera diferente?
ACTUALIZAR: .. u otra alternativa, podría definir mi propio constructor de valor monádico
finallyMyLastStepG :: Int -> MaybeG Int
finallyMyLastStepG a = JustG a
y producir otra variante de la misma cadena (con el mismo resultado).
*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (finallyMyLastStepG y)
JustG 9