Quando mi è sembrato di capire a cosa serve il ritorno in Haskell, ho provato a giocare con diverse alternative e sembra che il ritorno non solo possa essere usato in qualsiasi punto della catena monade, ma può anche essere esclusi completamenteCosa c'è di speciale nella parola chiave 'return'
*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
Anche se tralascio di ritorno nel mio istanze, ho solo avvertimento ...
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'
e posso ancora usare la monade
*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (JustG y)
JustG 9
*Main> JustG 9 >>= \y -> (NothingG) >>= \x -> (JustG y)
NothingG
Quindi, cosa c'è di così speciale nella parola chiave return? Si tratta di casi più complessi in cui non posso ometterlo? O perché questo è il modo "giusto" di fare le cose anche se possono essere fatte in modo diverso?
UPDATE: .. o un'altra alternativa, ho potuto definire mio costruttore valore monadico
finallyMyLastStepG :: Int -> MaybeG Int
finallyMyLastStepG a = JustG a
e produrre un'altra variante della stessa catena (con lo stesso risultato)
*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (finallyMyLastStepG y)
JustG 9
'return' non è una parola chiave. E sì, non fa il flusso di controllo come la parola chiave con lo stesso nome nella maggior parte dei linguaggi di programmazione imperativi, quindi il 'return ...' in 'do {pippo; ritorno ...; quux} 'è ridondante. – delnan
@delnan, il problema è quando leggo tutto sulle monadi, il "ritorno" nell'ultima riga sembrava il requisito. Ma nella mia terza linea l'ho sostituito con la creazione diretta di valore monadico e l'Haskell va bene con questo. – Maksee
@Maksee: avere un ritorno sull'ultima riga non è un requisito. Accade solo che per la monade Forse, l'operazione di bind contenga una costruzione di una nuova monade semplice. In genere non è il caso; considera, per esempio, la monade dell'identità. Non chiama 'return' su qualcosa in' bind'. –