这是几个问题合而为一:
用
do符号表示,每一行都必须返回相同的类型吗?例如,我可以在一个do块中写一行返回一个IO单子,另一行返回一个整数吗?(我的理解是,基于脱糖>>和>>=似乎如何工作,答案是否定的。)如果不是,那么编译器如何确定这些行必须全部返回什么类型?在我看到的所有示例中,作者都认为我们只是在使用
IOmonads。但是你怎么知道,对于给定的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块类型冲突的方式进行处理?