如何创建融合的Haskell容器?

时间:2014-12-03 05:16:10

标签: haskell stream-fusion

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

如果我的容器是Traversable,它会自动融合吗?如果我在mapAccumL方面实现了toList,那么Haskell是否足够聪明,根本不能将容器转换为List,而只是简单地对底层表示进行操作?

1 个答案:

答案 0 :(得分:9)

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

  1. 在已融合的东西之上构建它:使用foldr/build融合列出融合,并使用流融合融合矢量。如果你在其中一个之上构建你的类型,你可以安排它正确融合而不用大惊小怪。如果您有选择,这几乎肯定是您的最佳选择。

  2. 仅在界面处融合:即使您的类型没有融合,您可能希望在转换为列表或向量时或从列表或向量转换时安排一定量的融合。

  3. 自己编写融合规则:原则上这并不太难,但在实践中你撞到墙上,所以除非你像我一样疯狂,否则你可能我想避免这种做法:你的规则不会在你想要的情况下触发,它们会以复杂的方式干扰其他规则,内联器会让你成为&%$#@,即使事情似乎正常,基准测试也是如此将显示你想要的相反。