Haskell での return の意味を理解したように見えたとき、さまざまな代替案を試してみましたが、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
自分のインスタンスで 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