【发布时间】:2013-05-15 19:26:22
【问题描述】:
这是几个问题合而为一:
在
do表示法中,每一行是否必须返回相同的类型?例如,我可以在返回IOmonad 的单个do块中写一行,而另一行返回一个整数? (我的理解是,基于>>和>>=的脱糖似乎如何起作用,答案是否定的。)如果不是,那么编译器如何确定这些行都必须返回什么类型?在我看到的所有示例中,作者都认为我们只是在使用
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块的类型冲突的方式进行处理?
【问题讨论】:
-
你为什么不试试呢?此外,由于 do-notation 只是语法糖(正如您所说。翻译成
(>>=)和(>>))手头的机制与任何其他类型类完全相同,而不是特定于 do-notation 和 @ 987654334@s. -
抱歉,我上次编辑时不小心弄乱了代码格式(引入了枚举)。不幸的是,我的更正字符太少而不能作为编辑。请您再解决一下这个问题吗?
-
是的,我修好了。我看到您如何尝试使用 Markdown 编号列表,但它们似乎与代码块冲突。这就是为什么我选择将每个数字放在自己的段落中。
-
我认为,您必须将代码块再缩进 4 个空格(即总共 8 个空格)才能使其在枚举中工作。