2014-12-03 41 views
5

我有兴趣创建一个新的Haskell容器类型(严格列表),我想确保对它们的操作符合流融合的条件。如何选择ghc的流融合功能?如何创建融合的Haskell容器?

如果我的容器是Traversable,它会自动熔断吗?如果我以toList的角度实现了mapAccumL,那么Haskell是否足够聪明,根本不会将容器转换为List,而只是简单地在底层表示上操作?

+3

如果您想深入了解,请查看[流式融合论文](http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.104.7401)。 – luqui 2014-12-03 06:24:30

+0

ghc不实现流聚合。它实现了foldr/build融合。主要区别在于连接只能通过折叠/构建融合(尽管研究正在进行)来融合,而拉链只能通过销毁/未折叠融合(与流融合密切相关)融合。 – 2014-12-03 18:18:08

回答

9

GHC实际上并不聪明。这只是(好的)软件。如果你希望你的新的东西融合,你有几种选择:

  1. 构建它的东西,已经融合了顶部:列出引信使用foldr/build融合和载体引信使用流融合。如果你在其中一个上面建立你的类型,你可以安排它正确地融合而不会大惊小怪。如果您有选择,这几乎肯定是您的最佳选择。

  2. 保险丝只是在接口上:即使你的类型没有熔断,你可能想要安排一定量的融合,当它被转换为或从列表或向量。

  3. 写的融合规则自己:这是不是太硬的原则,但在实践中,你会冲击你靠着墙头,所以,除非你疯了像我一样,你可能希望避免使用此方法:你的规则不会在你想要的时候触发,它们会以复杂的方式干扰其他规则,内联将使你的行为看起来很正常,而基准测试会显示与你相反的东西想。