这是几个问题合而为一:
用
do
符号表示,每一行都必须返回相同的类型吗?例如,我可以在一个do
块中写一行返回一个IO
单子,另一行返回一个整数吗?(我的理解是,基于脱糖>>
和>>=
似乎如何工作,答案是否定的。)如果不是,那么编译器如何确定这些行必须全部返回什么类型?在我看到的所有示例中,作者都认为我们只是在使用
IO
monads。但是你怎么知道,对于给定的do
块,每行必须返回什么?再次假设#1 的答案是否定的:你如何使用不会在
do
块内返回正确类型的 monad 的函数?例如,考虑这个 websockets 代码:application :: MVar ServerState -> WS.Request -> WS.WebSockets WS.Hybi00 () application state rq = do WS.acceptRequest rq msg <- WS.receiveData :: WS.WebSockets WS.Hybi00 Text return ()
假设我想打印
msg
. 我将如何以不与do
块类型冲突的方式进行处理?