【发布时间】:2014-06-22 22:02:36
【问题描述】:
直到我今天编辑它,Haskell Wiki claimed Maybe 是一个可交换的 monad(实际上,我认为它仍然在某个地方声明它)。这显然是错误的,因为
do {a <- Nothing; b <- undefined; return (a,b)} === Nothing
同时
do {b <- undefined; a <- Nothing; return (a,b)} === undefined
这种可交换性的失败实际上在实际代码中相当重要:程序员依赖于这样一个事实,即计算将在到达Nothing 时立即停止。
这留下了(在 Haskell Wiki 上描述为可交换的单子中)只有 Reader 单子,它似乎没有做任何非常令人兴奋的事情。这在我的脑海中提出了一个问题,即 Haskell 中是否存在与 Reader 大不相同的可交换 monad,除了 of Reader 的限制。
编辑
我刚刚意识到也可以使受限的Writer monad 成为可交换的——它需要在一些可交换的幺半群中累积值。还是没意思。
【问题讨论】:
-
undefined有点作弊。请参阅:cse.chalmers.se/~nad/publications/…。你声称一个表达式等于undefined。但是undefined不等于任何东西。这不是一个值。如果不解决停机问题,就无法比较底部。 -
@nomen,
undefined没有==任何东西,但在一般意义上(基于指称语义)通常被认为等于任何其他底值。 -
是的,将所有底部设置为相等并不会使我的观点无效。事实上,如果你修改了这种等价关系,Haskell 是完全的(正如论文的观点)。现在,我的观点是,这是一种“作弊”,因为您使用的语义与隐含使用的语句(“也许是可交换的”)不同。
-
@nomen,我不知道你在说什么。等于所有底部仍然不能使
Nothing === bottom。 -
如果排除底部,则不包括底部...