受限制单子的当前状态是什么?

25

从至少1990年代末开始,就有人希望以友好的方式将受限制的单子集成到Haskell中。

例如,如果没有受限制的单子,你无法将SetMap概率分布转换为有效的单子。这里是几年前一个SO 问题,有人遇到了这个问题。

人们提出了各种解决方法,包括:

然而,这些方法中似乎没有一种是“规范”的。在此博客文章的Don Stewart在2007年发表的评论中,他暗示我们“非常接近”使用Indexed types实现有限制的单子。

当前状态如何?现在是否有一种“规范”的方法来处理有限制的单子?还是我们仍然要使用变通方法?


12
我认为使用约束种类(constraint kinds)是最合适的,虽然它们有点新,所以在最常见的解决方案中并不是最普遍的。 - leftaroundabout
2个回答

12

Anders Persson、Emil Axelsson和Josef Svenningson最近发表了一篇论文,展示了一种编码受限单子的方法。我忘记了具体细节,但我记得这是一篇很好的论文。

Persson, A. ; Axelsson, E. ; Svenningsson, J. (2011). 嵌入式语言的通用单子构造。IFL 2011,第23届函数式语言实现和应用研讨会。


1
谢谢Norman。对于任何感兴趣的人,你可以从Josef Svenningson的主页(http://www.cse.chalmers.se/~josefs/)获取论文副本。 - Chris Taylor

11

实际上,可以以两种不同的方式获得高效的Set单子,而不需要任何限制。下面的文章解释了这两种方法:

http://okmij.org/ftp/Haskell/set-monad.html

该文章还指出受限单子非常受限,阻止了许多单子范例。我推测实现方法是通用的,并且任何受限单子都可以转换为常规单子而不会失去效率。因此,看起来我们根本不需要受限单子。


我实际上已经使用了你高效的Set单子背后的思想来构建一个高效的概率分布单子(见https://github.com/chris-taylor/hs-probability/blob/master/src/Control/Probability/Bayes.hs)...所以谢谢!我还没有考虑过为其他受限制的单子做同样的事情,但我立刻看不出为什么它不会起作用。 - Chris Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接