当我似乎理解了 Haskell 中 return 的用途时,我尝试使用不同的替代方案,似乎 return 不仅可以在 monad 链中的任何地方使用,而且可以完全排除
*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
那么 return 关键字有什么特别之处呢?这是关于我不能省略的更复杂的情况吗?还是因为这是做事的“正确”方式,即使它们可以以不同的方式完成?
更新: ..或另一种选择,我可以定义我自己的一元值构造函数
finallyMyLastStepG :: Int -> MaybeG Int
finallyMyLastStepG a = JustG a
并产生同一链的另一个变体(具有相同的结果)
*Main> JustG 9 >>= \y -> (JustG 11) >>= \x -> (finallyMyLastStepG y)
JustG 9