Haskell中do记号如何脱糖?结合Aeson与HTTP调用实例的疑问
问题1:do表达式的脱糖结果
你的main函数对应的do表达式完整脱糖结果如下:
main = get "http://jsonplaceholder.typicode.com/todos/1" >>= (\x -> let y = encode x in B.putStrLn y)
所以你问题中?的位置需要填写的是lambda表达式:\x -> let y = encode x in B.putStrLn y。
补充说明:你之前了解的是仅包含<-绑定的do脱糖规则,do表达式中的let语句不需要额外嵌套>>=,只是将绑定的变量引入到后续代码的作用域中,直接放到lambda的函数体内即可。
问题2:什么是action
在Haskell的IO Monad语境下,*action(操作)*本质是类型为IO a的一等值,你可以把它理解为封装了带副作用的计算逻辑的描述文件:
- 它本身只是对要执行操作的静态描述,定义时不会立刻执行,只有当它被放到
main函数、或者被组合进其他会被main执行的IO计算链路中时,才会真正触发执行 - 操作符
>>=的作用就是按顺序拼接两个action:前一个action执行完成后,将其返回值传给后续的函数,生成下一个要执行的action - 比如你代码中的
get "http://jsonplaceholder.typicode.com/todos/1"就是一个返回请求结果的IO action,B.putStrLn y是一个打印字节串、返回空值(IO ())的IO action
内容的提问来源于stack exchange,提问作者Poperton
相关产品推荐
相关产品推荐

