Когда я, казалось, понял, для чего вернется возвращение в Haskell, я попытался сыграть с различными альтернативами, и кажется, что возвращение не только может быть использовано где угодно в цепочке монад, но также может быть полностью исключитьЧто такого особенного в ключе '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
Даже если я опускаю возвращение в моем собственном инстансов, я только получаю предупреждение ...
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
Так что же такого особенного в ключевом слове return? Это более сложные случаи, когда я не могу его опустить? Или потому, что это «правильный» способ делать вещи, даже если они могут быть сделаны по-другому?
UPDATE: .. или другая альтернатива, я мог бы определить мой собственного конструктор монадического значения
finallyMyLastStepG :: Int -> MaybeG Int
finallyMyLastStepG a = JustG a
и производит другой вариант тех же цепи (с тем же результатом)
*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (finallyMyLastStepG y)
JustG 9
'return' - это не ключевое слово. И да, он не выполняет поток управления, как ключевое слово с тем же именем, что и в большинстве императивных языков программирования, поэтому 'return ...' in 'do {foo; вернуть ...; quux} 'является избыточным. – delnan
@ delnan, проблема в том, что когда я читаю все о монадах, «возвращение» на последней строке выглядит как требование. Но в моей третьей строке я заменил его прямым монадическим созданием ценности, и Haskell в порядке с этим. – Maksee
@Maksee: Возвращение на последней строке не является обязательным требованием. Так получилось, что для монады Maybe возможно, что операция привязки содержит конструкцию новой простой монады. Обычно это не так; рассмотрим, скажем, тождественную монаду. Он не называет 'return' ничем в' bind'. –