如何创建融合的Haskell容器?

yon*_*ong 5 haskell stream-fusion

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

如果我的容器是Traversable,它会自动融合吗?如果我实现了,说mapAccumL来讲toList,将哈斯克尔足够聪明,不是容器转换到一个列表所有,而不是简单地对底层表示操作?

dfe*_*uer 9

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

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

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

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