这个简单的 do 符号在什么情况下脱糖?

In what does this simple do notation desugar to?

我正在使用 AesonNetwork.HTTP。我能够对 json 进行编码并将其打印在屏幕上,执行以下操作:

getCode :: String -> IO ResponseCode
getCode url = simpleHTTP req >>= getResponseCode
    where req = getRequest url

main :: IO ()
main = do 
    x <- get "http://jsonplaceholder.typicode.com/todos/1"
    let y = encode x
    B.putStrLn y

但是我不明白这个 do 表达式脱糖的目的是什么。像这样:

get "http://jsonplaceholder.typicode.com/todos/1" >>= (?)

? 中应该包含什么?

我只知道怎么脱糖:

do { x1 <- action1
   ; x2 <- action2
   ; mk_action3 x1 x2 }

至此

action1 >>= (\ x1 -> action2 >>= (\ x2 -> mk_action3 x1 x2 ))

顺便问一下,什么是 actionhttps://en.m.wikibooks.org/wiki/Haskell/do_notation没有解释的很准确

get "http://jsonplaceholder.typicode.com/todos/1" >>= (\x -> let y = encode x in B.putStrLn y)

put (x :: s) 是一个 State s“动作”。

put :: s -> State s () 是一个从 s 类型值到 State s“动作”的函数,一个“动作”构造函数。

putStrLn "Hi" 是一个 IO 动作。 putStrLn :: String -> IO () 是从 StringIO 个动作的函数,一个“动作”构造函数。

IO 是一个 Monad。 State s 是一个 Monad。

“动作”是 M a 类型的任何值,其中 M 是 Monad。