【问题标题】:How to create Haskell containers that fuse?如何创建融合的 Haskell 容器?
【发布时间】:2015-01-31 13:39:28
【问题描述】:

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

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

【问题讨论】:

  • 如果您想深入了解,请查看stream fusion paper
  • ghc 没有实现流融合。它实现了 foldr/build 融合。主要区别在于 concat 只能通过 foldr/build 融合进行融合(尽管研究正在进行中),而 zip 只能通过 destroy/unfoldr 融合进行融合(与流融合密切相关)。

标签: haskell stream-fusion


【解决方案1】:

GHC 实际上一点也不智能。它只是(好)软件。如果你想让你的新东西融合,你有几个选择:

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

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

    李>
  3. 自己编写融合规则:原则上这并不难,但实际上你将你的头撞到墙上,所以除非你像我一样疯狂,否则你可能想要避免这种方法:你的规则不会在你想要的时候触发,它们会以复杂的方式干扰其他规则,内联器会让你成为 &%$#​​@,即使事情看起来正常,基准测试也会显示与你想要的相反的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    • 2014-06-23
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多