Maybe
モナドの定義を見てみましょう。
instance Monad Maybe where
return = Just
Just a >>= f = f a
Nothing >>= _ = Nothing
そしてdo
、関数の-notationを脱糖します。
func' =
Nothing >>= \a ->
return a
の最初の引数>>=
はであり、上記の定義から、2番目の引数を無視してNothing
いることがわかります。>>=
したがって、次のようになります。
func' = Nothing
関数\a -> ...
が呼び出されるa
ことはないため、割り当てられることはありません。したがって、答えは次のとおりa
です。到達すらされていません。
脱do
糖-表記については、これがどのように行われるかについての簡単なスケッチです(私が行った1つの簡略化-処理fail
、つまり一致しないパターン):
do {a; rest} → a >> do rest
これ>>
は通常、>>=
asの観点から実装されることに注意してくださいa >>= \_ -> do rest
(つまり、2番目の関数は引数を無視するだけです)。
do {p <- a; rest} → a >>= \p -> do rest
do {let x = a; rest} → let x = a in do rest
そして最後に:
do {a} = a
次に例を示します。
main = do
name <- getLine
let msg = "Hello " ++ name
putStrLn msg
putStrLn "Good bye!"
脱糖剤:
main =
getLine >>= \name ->
let msg = "Hello " ++ name in
putStrLn msg >>
putStrLn "Good bye!"
そして、好奇心旺盛な人のためにそれを完成させるために、ここにdo {p <- a; rest}
(Haskellレポートから直接取られた)の「正しい」翻訳があります:
do {pattern <- a; rest} → let ok pattern = do rest
ok _ = fail "error message"
in a >>= ok